标签: jooq

使用jOOQ从值()中选择插入并使用正确的类型转换

我正在使用jOOQ将很多行插入到一个多对多关系的表中.代码工作,生成的SQL是预期的,我的问题是,我希望jOOQ代码可以更简单.

我有一个简化的结构(所有重命名,删除大多数字段,删除大多数约束,它只是一个愚蠢,但准确的结构示例):

CREATE TABLE person (
    person_id BIGSERIAL PRIMARY KEY,
    person_name VARCHAR(64) NOT NULL UNIQUE
);

CREATE TABLE company (
    company_id BIGSERIAL PRIMARY KEY,
    company_name VARCHAR(100) NOT NULL UNIQUE
);

CREATE TABLE employment_contract (
    company_id BIGINT NOT NULL REFERENCES company,
    person_id BIGINT NOT NULL REFERENCES person,
    PRIMARY KEY (company_id, person_id),

    salary INT NOT NULL,
    creation_date_time TIMESTAMP NOT NULL
);
Run Code Online (Sandbox Code Playgroud)

我的插入代码:

Table<Record4<String, String, Integer, Timestamp>> insertValues = values(
    row(
        cast(null, COMPANY.COMPANY_NAME),
        cast(null, PERSON.PERSON_NAME),
        cast(null, EMPLOYMENT_CONTRACT.SALARY),
        cast(null, EMPLOYMENT_CONTRACT.CREATION_DATE_TIME)
    )
).as("insert_values",
        COMPANY.COMPANY_NAME.getName(),  -- …
Run Code Online (Sandbox Code Playgroud)

java sql postgresql jooq

17
推荐指数
1
解决办法
1022
查看次数

如何从 jOOQ 中的值 T 明确创建 Field&lt;T&gt; ?

在 jOOQ 中,很容易在表达式中使用绑定变量,例如:

MY_TABLE.COL.eq(1);
MY_TABLE.COL.in(1, 2, 3);
MY_TABLE.COL.between(1).and(10);
Run Code Online (Sandbox Code Playgroud)

以上所有方法都接受TField<T>类型,例如Field.eq(T)or Field.eq(Field<T>)。但是如果我想把绑定变量放在表达式的左边怎么办?这些显然不起作用:

1.eq(MY_TABLE.COL);
1.in(MY_TABLE.COL1, MY_TABLE.COL2, MY_TABLE.COL3);
1.between(MY_TABLE.COL1).and(MY_TABLE.COL2);
Run Code Online (Sandbox Code Playgroud)

我怎样才能把这些1or"xyz"变成Field<Integer>orField<String>等等?

(这是 jOOQ 邮件列表等上的一个热门问题,所以我在这里记录)

java sql jooq

16
推荐指数
1
解决办法
427
查看次数

如何从Jooq中的其他自定义(concat,sum,count)列获取数据库中的所有结果列

我有一个表有1列的表1.

这是我需要映射的sql语句.

Select *,count(ID) as IdCount from Table1;
Run Code Online (Sandbox Code Playgroud)

现在,sql查询结果将是7列(6个Table1列和1个IdCount列).但是当我使用此查询在Jooq中实现相同时,它只获得一个列"IDCount".

SelectQuery q = factory.selectQuery();
        q.addSelect(Table1.ID.count().as("IdCount"));
        q.addFrom(Table1.TABLE1);
Run Code Online (Sandbox Code Playgroud)

现在,结果记录集只有一列"IdCount",而我需要的是所有列和一个附加列"IdCount".我也想在Jooq中使用7列.

java sql jooq

15
推荐指数
1
解决办法
6486
查看次数

jOOQ - 支持JSR310

jOOQ是否支持JSR310与PostgreSQL结合使用?特别是,我试图使用以下类:

  • java.time.Instant
  • java.time.LocalDate
  • java.time.LocalTime
  • java.time.LocalDateTime

我存储在以下数据类型中(根据http://www.postgresql.org/docs/9.1/static/datatype-datetime.html):

  • java.time.Instant: timestamp with timezone
  • java.time.LocalDate: date
  • java.time.LocalTime: time without timezone
  • java.time.LocalDateTime: timestamp without timezone

这些数据类型是否正确?

是否jOOQ支持转换之间java.sql.Timestamp,java.sql.Date以及java.sql.Time和四大类以上(双向)?

java sql jooq jsr310

15
推荐指数
2
解决办法
3528
查看次数

Spring Boot with JOOQ 和 Spring Data JPA 的技术区别

您什么时候将 Spring Data JPA 用于 Spring Boot 和 JOOQ,反之亦然?

我知道 Spring Data JPA 可用于完成基本的 CRUD 查询,但不适用于复杂的连接查询,而使用 JOOQ 使其更容易?

编辑:您可以将 Spring 数据 jpa 与 jooq 一起使用吗?

spring jooq spring-data spring-data-jpa spring-boot

14
推荐指数
2
解决办法
2657
查看次数

如何使用jOOQ代码生成器和Maven的自定义策略?

使用jOOQ,我可能希望将jOOQ代码生成器与Maven自定义生成器策略结合使用.看起来好像可以这样做(省略不相关的部分):

<plugin>
  <groupId>org.jooq</groupId>
  <artifactId>jooq-codegen-maven</artifactId>
  <version>2.2.2</version>

  <!-- The plugin should hook into the generate goal -->
  <executions>
    <execution>
      <goals>
        <goal>generate</goal>
      </goals>
    </execution>
  </executions>

  <configuration>
    <generator>
      <name>org.jooq.util.DefaultGenerator</name>
      <!-- But the custom strategy is not yet compiled -->
      <strategy>
        <name>com.example.MyStrategy</name>
      </strategy>
    </generator>
  </configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)

以上配置描述了该问题.jOOQ的代码生成器挂钩到Maven生命周期的生成目标,该生成目标发生在生命周期的编译目标之前.但是,对于代码生成,它需要一个预编译的自定义策略类,否则我会得到一个ClassNotFoundException.如何用Maven解决这个问题?我可以在执行generate目标之前编译单个类吗?

java code-generation maven jooq

13
推荐指数
1
解决办法
1610
查看次数

JOOQ和交易

我一直在阅读关于交易和jooq但我很难看到如何在实践中实现它.

假设我为JOOQ提供了一个自定义ConnectionProvider,它恰好使用自动提交设置为false的连接池.

实施大致如下:

@Override public Connection acquire() throws DataAccessException {
    return pool.getConnection();
}

@Override public void release(Connection connection) throws DataAccessException {
    connection.commit();
    connection.close();
}
Run Code Online (Sandbox Code Playgroud)

如何将两个jooq查询包装到单个事务中?

使用DefaultConnectionProvider很容易,因为只有一个连接 - 但是对于一个池我不知道如何去做.

java sql transactions jooq

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

jOOQ我可以将两个表的连接提取到相应的POJO中

在jOOQ中如果我想将一行表取出到jOOQ自动生成的POJO中,例如:

dsl.selectFrom(USER)
                .where(USER.U_EMAIL.equal(email))
                .fetchOptionalInto(User.class);
Run Code Online (Sandbox Code Playgroud)

现在,假设我想要做的两个表之间,例如联接USERROLE,我怎样才能获取结果到POJO的这两个表?

java jooq

13
推荐指数
1
解决办法
8685
查看次数

如何在jOOQ中的同一个表上写LEFT OUTER JOIN?

如何使用jOOQ编写以下SQL?

SELECT *
FROM food_db_schema.tblCategory AS t1
LEFT OUTER JOIN food_db_schema.tblCategory AS t2 ON t1.category_id = t2.parent_id
WHERE t2.parent_id IS NULL
AND t1.heartbeat = "ALIVE";
Run Code Online (Sandbox Code Playgroud)

数据库是mySQL

mysql sql jooq

11
推荐指数
2
解决办法
3980
查看次数

如何使用带连接的查询从jOOQ中的一个表中进行选择?

我在jOOQ中有以下查询:

factory()
.select()
.from(PERSON)
.join(ENDUSER).on(ENDUSER.PERSON_FK.equal(PERSON.ID))
.where(ENDUSER.ID.equal(userId))
.fetchOne();
Run Code Online (Sandbox Code Playgroud)

这个查询返回给我一个记录,包含PERSON和ENDUSER的所有列,但我只想要PERSON的列(这就是我放弃的原因.from(PERSON)而不是.from(PERSON, ENDUSER)).我知道这并不重要,但我不希望返回不必要的字段.

java mysql jooq

11
推荐指数
2
解决办法
4326
查看次数