我有一个非常通用的 API,可以使用 JOOQ 将内容插入到某些表中:
void insert(@NonNull final Table<?> table,
@NonNull final Collection<Field<?>> columns,
@NonNull final Collection<Object> values) {
dslContext.insertInto(table)
.columns(columns)
.values(values)
.execute();
}
Run Code Online (Sandbox Code Playgroud)
有没有办法返回插入的记录的ID?我的数据库中表的所有主键都命名为“id”,因此我可以对它进行 ahrdcode,但我找不到返回它并转换为 Integer / Long 的方法。我正在使用 JOOQ 3.9.5。
编辑:我在下面使用 MSSQL。
我有一个简单的 Postgres 测试表,其中包含 id、时间戳和时区。下面的测试和输出应该是不言自明的,但总而言之,我插入了一行,其时间戳的偏移量为 -6。它被正确地插入到数据库中,然后以相同的时间从数据库中加载出来,但是偏移量错误,特别是Z而不是-6。
我尝试将数据库设置为 UTC,当我在命令行中手动选择时,它会正确显示 UTC 时间。将数据库设置为 mountain,它显示预期时间,偏移量为-6。
通过在 jOOQ 中执行的语句强制数据库到不同的时区似乎没有任何作用。
context.execute( "set timezone TO 'GMT';" ); // this has no effect
Run Code Online (Sandbox Code Playgroud)
强制我的系统时间为 UTC 可以有效解决该问题,但由于多种原因是不可接受的。
TimeZone.setDefault( TimeZone.getTimeZone( "UTC" ) ); // this is a band aid that works, but is not sustainable
Run Code Online (Sandbox Code Playgroud)
这是单元测试:
@Test
public void confirmDateRoundTripFromDb() throws SQLException, DatatypeConfigurationException
{
ZonedDateTime testDate = ZonedDateTime.of( 2019, 05, 30, 12, 54, 32, 203, TimeUtilities.CENTRAL_ZONEID );
final OffsetDateTime testDateAsOffset = testDate.toOffsetDateTime( );
try( PGConnection dbConnection = DatabaseUtility.getPostgresConnection( _unitTestConfig.getSection("Postgres").getProperties(), _testDbName ) …Run Code Online (Sandbox Code Playgroud) 我想使用 Quarkus 中的 JOOQ DSL 来构建我的 SQL(并希望执行它们)。
因此我添加了以下Quarkus JOOQ 扩展。
因为我想在我的项目中使用反应式PG SQL 客户端,所以我问自己fetch()JOOQ 的方法是否会阻塞线程?它与底层的反应式 vertx 客户端兼容还是使用阻塞客户端?看起来像后一种,因为它不会返回未来或类似的东西。
在这种情况下,我可能应该只使用 JOOQ 来创建 SQL 字符串。
在jOOQ 代码生成中,可以将转换器分配给NOT NULL字段,如下所示:
<forcedType>
<includeTypes>(?i)^varchar\(\d+\)$</includeTypes>
<userType>String</userType>
<nullability>NOT_NULL</nullability><!-- Converter applies only to NOT NULL columns! -->
<converter>StringCaseConverter</converter>
</forcedType>
Run Code Online (Sandbox Code Playgroud)
然后转换器可以像这样实现:
public class StringCaseConverter extends org.jooq.impl.AbstractConverter<String, String> {
public StringCaseConverter() {
super(String.class, String.class);
}
@Override
public String from(String databaseObject) {
return databaseObject.toLowerCase(); // FIXME: this throws NPE if argument is ever null!
}
@Override
public String to(String userObject) {
return userObject.toUpperCase(); // FIXME: this throws NPE if argument is ever null!
}
}
Run Code Online (Sandbox Code Playgroud)
在典型场景中,如果只是对具有此类列的表执行标准 CRUD,则databaseObject永远不可能null,因此这样的实现似乎就足够了。 …
我正在进行表A和表B的左连接,并尝试将结果提取到自定义POJO中,其中包含表A和表B中的字段,如下所示:
List<MyCustomPojo> res = create.select()
.from(TABLE_A)
.leftJoin(TABLE_B)
.on(TABLE_A.MY_CODE.eq(TABLE_B.MY_CODE))
.fetchInto(MyCustomPojo.class);
Run Code Online (Sandbox Code Playgroud)
除了myCode这两个表连接的字段之外,它适用于所有字段.对我来说,myCode的值是从右表中获取的,表B,对于表A中所有那些在表B中没有相应条目的记录都是NULL.我想知道jooQ如何决定哪个字段为映射到POJO并在任何地方记录此行为.
我的目标是将表A和表B中的所有字段提取到自定义POJO中,以便从左表中获取myCode.我很感激你就正确的方法提出建议.
我有一个界面
public interface HistoryDao<B extends UpdatableRecord<B>, H extends UpdatableRecord<H>> extends TableDao<H>{
default void saveHistoryForIds(List<Integer> ids) {
HashMap<? extends TableField<H, ? extends TableField<H, ? extends Serializable>>, ? extends TableField<B, ? extends TableField<B, ? extends Serializable>>> mappings = setUpHistoryMapping();
List<? extends TableField<H, ? extends Serializable>> tableFields = new ArrayList<>(mappings.keySet());
ArrayList<H> hs = new ArrayList<>();
jooq()
.insertInto(table(), tableFields);
}
HashMap<? extends TableField<H, ? extends TableField<H, ? extends Serializable>>, ? extends TableField<B, ? extends TableField<B, ? extends Serializable>>> setUpHistoryMapping();
}
Run Code Online (Sandbox Code Playgroud)
(TableDao是一个界面,但它不是非常重要)
在我的具体课程中,我尝试实施
MyClassHere implements …Run Code Online (Sandbox Code Playgroud) 我想现在在开发过程中使用一个RDBMS和在生产中使用另一个RDBMS是很常见的.我想在开发中使用H2,在生产中使用MariaDB来实现Spring Boot和JOOQ应用程序.
是否有一些聪明的方法可以使相同的生成的JOOQ代码在开发和生产环境中都能工作,或者我是否需要根据目标环境生成两组代码?如果后者是真的,如何以理智的方式做到这一点,例如使用nu.studer.jooqgradle插件?
每当我尝试使用针对MariaDB服务器的H2数据库生成的源时,都会抛出这样的异常:
org.mariadb.jdbc.internal.util.dao.QueryException: SELECT command denied to user 'foo'@'localhost' for table 'FOO'
Query is: select `PUBLIC`.`FOO`.`ID`, `PUBLIC`.`FOO`.`NAME`, `PUBLIC`.`FOO`.`INFO` from `PUBLIC`.`FOO`
Run Code Online (Sandbox Code Playgroud)
我对H2和MariaDB使用相同的flyway初始化/迁移脚本.
我有使用项目gradle-jooq-plugin-3.0.1,jooq-3.11.2和Spring引导1.当我尝试生成JOOQ档案我得到以下错误信息:
> Task :generateSampleJooqSchemaSource FAILED
Error: Could not find or load main class org.jooq.codegen.GenerationTool
Run Code Online (Sandbox Code Playgroud)
这是一个缩小的构建文件:
plugins {
id 'nu.studer.jooq' version '3.0.1'
id 'org.springframework.boot' version '1.5.14.RELEASE'
id 'java'
}
repositories {
mavenCentral()
}
dependencies {
jooqRuntime 'com.h2database:h2:1.4.177'
compile 'org.jooq:jooq'
}
bootRepackage.enabled = false
jooq {
version = '3.11.2'
sample(sourceSets.main) {
jdbc {
driver = 'org.h2.Driver'
url = 'jdbc:h2:~/test-gradle'
user = 'sa'
password = ''
}
generator {
database {}
target {
packageName = 'org.jooq.example.gradle.db'
}
}
} …Run Code Online (Sandbox Code Playgroud) 正如我们所看到的,获得数据源之后。我们需要根据我们使用的数据库配置SQL方言。选择特定的方言之后,将如何使用它来进行特定于DB的SQL查询。诸如hibernate和JOOQ之类的框架是否根据所选的方言以字符串形式构造SQL查询?如果是这样,那么在我们自己的框架中支持这一点的最佳方法是什么?
jooq ×10
java ×5
converters ×1
gradle ×1
h2 ×1
hibernate ×1
inheritance ×1
jdbc ×1
join ×1
jooq-codegen ×1
left-join ×1
mariadb ×1
orm ×1
pgjdbc-ng ×1
quarkus ×1
spring-boot ×1
spring-jdbc ×1
sql ×1
sql-server ×1
vert.x ×1