我正在使用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) 在 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)
以上所有方法都接受T
和Field<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)
我怎样才能把这些1
or"xyz"
变成Field<Integer>
orField<String>
等等?
(这是 jOOQ 邮件列表等上的一个热门问题,所以我在这里记录)
我有一个表有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列.
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
和四大类以上(双向)?
您什么时候将 Spring Data JPA 用于 Spring Boot 和 JOOQ,反之亦然?
我知道 Spring Data JPA 可用于完成基本的 CRUD 查询,但不适用于复杂的连接查询,而使用 JOOQ 使其更容易?
编辑:您可以将 Spring 数据 jpa 与 jooq 一起使用吗?
使用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
目标之前编译单个类吗?
我一直在阅读关于交易和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很容易,因为只有一个连接 - 但是对于一个池我不知道如何去做.
在jOOQ中如果我想将一行表取出到jOOQ自动生成的POJO中,例如:
dsl.selectFrom(USER)
.where(USER.U_EMAIL.equal(email))
.fetchOptionalInto(User.class);
Run Code Online (Sandbox Code Playgroud)
现在,假设我想要做的两个表之间,例如联接USER
和ROLE
,我怎样才能获取结果到POJO的这两个表?
如何使用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
我在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)
).我知道这并不重要,但我不希望返回不必要的字段.
jooq ×10
java ×8
sql ×6
mysql ×2
jsr310 ×1
maven ×1
postgresql ×1
spring ×1
spring-boot ×1
spring-data ×1
transactions ×1