标签: jooq

使用 JOOQ 返回通用插入中的 id

我有一个非常通用的 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。

java sql sql-server jooq

3
推荐指数
1
解决办法
3093
查看次数

jOOQ 将偏移日期时间返回为 Z (UTC),即使它不是

我有一个简单的 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)

java jooq pgjdbc-ng

3
推荐指数
1
解决办法
2750
查看次数

在 Quarkus 中将 JOOQ 与 Reactive SQL 客户端结合使用

我想使用 Quarkus 中的 JOOQ DSL 来构建我的 SQL(并希望执行它们)。
因此我添加了以下Quarkus JOOQ 扩展

因为我想在我的项目中使用反应式PG SQL 客户端,所以我问自己fetch()JOOQ 的方法是否会阻塞线程?它与底层的反应式 vertx 客户端兼容还是使用阻塞客户端?看起来像后一种,因为它不会返回未来或类似的东西。

在这种情况下,我可能应该只使用 JOOQ 来创建 SQL 字符串。

jdbc jooq vert.x quarkus

3
推荐指数
1
解决办法
1230
查看次数

jOOQ NOT NULL 列转换器:如果列不能为空,为什么需要处理 null?

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,因此这样的实现似乎就足够了。 …

converters jooq jooq-codegen

3
推荐指数
1
解决办法
762
查看次数

2
推荐指数
1
解决办法
1057
查看次数

在jooQ中使用Left Join自定义POJO

我正在进行表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.我很感激你就正确的方法提出建议.

java join left-join jooq

2
推荐指数
1
解决办法
1558
查看次数

Java Generics&jOOQ - 如何创建一个jOOQ列的HashMap到另一个

我有一个界面

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)

java inheritance jooq

2
推荐指数
1
解决办法
329
查看次数

使用生成的JOOQ代码定位多个数据库类型

我想现在在开发过程中使用一个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初始化/迁移脚本.

h2 spring-jdbc mariadb jooq spring-boot

2
推荐指数
1
解决办法
520
查看次数

无法使用gradle-jooq-plugin-3.0.1,jooq-3.11.2查找或加载主类org.jooq.codegen.GenerationTool

我有使用项目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)

gradle jooq

2
推荐指数
1
解决办法
1137
查看次数

SQL方言实际上如何在诸如hibernate和JOOQ之类的框架中内部工作

正如我们所看到的,获得数据源之后。我们需要根据我们使用的数据库配置SQL方言。选择特定的方言之后,将如何使用它来进行特定于DB的SQL查询。诸如hibernate和JOOQ之类的框架是否根据所选的方言以字符串形式构造SQL查询?如果是这样,那么在我们自己的框架中支持这一点的最佳方法是什么?

orm entity-framework hibernate jooq

2
推荐指数
1
解决办法
359
查看次数