我正在尝试使用 JOOQ 对 Mysql DB 的结果进行分页,我想请求 MySQL DB 获取特定的偏移量。
我的客户请求具有不同偏移量的不同大小的结果,并且我的服务是无状态的。
我不想使用 limit 和 offset 因为我知道它们的性能很差。
public void fetch() {
Cursor<Record> cursor = null;
String query = "books WHERE type = 'KIDS'";
try {
cursor = create.selectFrom(query).fetchLazy();
while (cursor.hasNext()) {
Record book = cursor.fetchNext();
}
}
finally {
if (cursor != null) {
cursor.close();
}
}
}
Run Code Online (Sandbox Code Playgroud)
如何从第 5 页或第 1000 到 1100 本书开始?
最好的问候,马坦
我有一个字符串(jsonData)通过 Jackson 对象映射器映射到 json,如下所示到 JaxB。
var completeJson = objectMapper.readValue(jsonData, Data.class);
myDto.setFirstName(completeJson.getFirstName())
myDto.setLastName(completeJson.getLastName()))
.....
.....etc..etc
Run Code Online (Sandbox Code Playgroud)
我能够很好地映射到上面的字符串。但是,我在映射到 jooq JSON 对象时遇到问题。我想我现在必须将 jsonData 转换为 jooq JSON。
我该怎么做?
JSON newJson = objectMapper.(best method to use);
myDto.setJsonSource(newJson)
Run Code Online (Sandbox Code Playgroud)
或者也许我必须创建某种包装器?
jooq配置的DTO
public myDto setJsonSource(JSON jsonSource) {
this.jsonSource = jsonSource;
return this;
}
Run Code Online (Sandbox Code Playgroud) 我发现Factory类中的distinct函数只接受一个参数
public static AggregateFunction<Integer> countDistinct(Field<?> field);
Run Code Online (Sandbox Code Playgroud)
并且没有类似的功能 distinct(Field... fields)
我想表达这样的 SQL 语句:
select c1, count(distinct c2,c3) from t1 group by c1;
Run Code Online (Sandbox Code Playgroud)
PS:有一个非 dsl api: SelectQuery.setDistinct(true),但它会“区分”所有列,这不是我想要的。
PostgreSQL 9.3/postgresql-9.3-1100-jdbc41.jar
我有一个类型列的表timezone without time zone,这将生成我的具有适用java.util.Timestamp属性的对象.
在插入期间,我看到的是jOOQs绑定过程将a java.util.Timestamp转换为具有本地时区偏移的日期.
例如,对于unix时间戳1421109419(2015年1月13日00:36:59 GMT),该属性设置为new Timestamp(1421109419 * 1000).
从jOOQ记录器我看到:
2015-01-13 14:14:31,482 DEBUG [http-bio-8002-exec-4] org.jooq.tools.LoggerListener#debug:255 - -> with bind values : insert into "foo"."bar" ("start_date") values (timestamp '2015-01-13 13:36:59.0') returning "foo"."bar"."id"
2015-01-13 14:14:31,483 TRACE [http-bio-8002-exec-4] org.jooq.impl.DefaultBinding#trace:179 - Binding variable 3 : 2015-01-13 13:36:59.0 (class java.sql.Timestamp)
Run Code Online (Sandbox Code Playgroud)
确实在记录中的值是"2015-01-13 13:36:59".
该软件在NZDT的机器上运行,解释了+13偏移量.
鉴于在TimeZone不可知容器(Timestamp)中提供时间,我希望在创建insert语句时能够得到尊重.
如何让jOOQ创建时间戳不是在当地时间?
有没有办法指定用于从JOOQ生成SQL查询的编码?我们有非UTF-8编码的oracle数据库,并且生成的相等字符串条件查询包含UTF-8字符
这是我对Jooq查询的不满:
private List<UserEmailOrganisation> getEmailsAndOrgNames() {
Result<Record2<String, String>> r = dsl
.fetch(dsl
.select(I_USERS.EMAIL_ID, I_ORGANISATIONS.NAME)
.from(I_USERS)
.leftOuterJoin(I_ORGANISATIONS)
.on(I_USERS.ORGANISATION_ID.equal(I_ORGANISATIONS.ID))
.where(DSL.timestampAdd(I_USERS.UPDATED, MINIMUM_INACTIVE_DATE,
DatePart.DAY).lessOrEqual(DSL.currentTimestamp())));
logger.debug(r.toString());
return r.into(UserEmailOrganisation.class);
}
Run Code Online (Sandbox Code Playgroud)
logger.debug方法打印 -
|email_id |name |
+-----------------------------------+----------------+
|email1@some.com |org1 |
|email2@some.com |org2 |
Run Code Online (Sandbox Code Playgroud)
所以我的查询时返回了一定的成效.所以我认为问题不在于查询而在于into方法.
这是我的UserEmailOrganisation类
public class UserEmailOrganisation {
public String emailId;
public String name;
public UserEmailOrganisation(String emailId, String name) {
this.emailId = emailId;
this.name = name;
}
}
Run Code Online (Sandbox Code Playgroud)
来自JOOQ文档 http://www.jooq.org/javadoc/3.5.x/org/jooq/impl/DefaultRecordMapper.html
如果没有可用的默认构造函数,但至少有一个"匹配"构造函数可用,则使用该构造函数.
"匹配"构造函数的参数与此记录保持字段的参数完全相同当找到多个"匹配"构造函数时,会选择第一个构造函数(由Class.getDeclaredConstructors()报告当调用"匹配"构造函数时,值为转换为构造函数参数类型.
所以我的代码应该正常工作?因为它有一个匹配的构造函数.但事实并非如此.我得到以下异常.
org.jooq.exception.MappingException: No matching constructor found on type class com.kubera.insights.admin.jobs.BackOfficeUsersReminderJob$UserEmailOrganisation for record org.jooq.impl.DefaultRecordMapper@2ccd7880 …Run Code Online (Sandbox Code Playgroud) 我在JOOQ中有一个查询,它包含一个LEFT OUTER JOIN和另一个表.这是故意的,因为不能保证存在相应的记录,在这种情况下,我仍然希望从前一个表中检索值,并提供缺省字段的缺失字段.
但是,由于getValue()具有默认参数的函数已被弃用,如何检查该字段是否包含NULL值?
使用字符串很容易,但布尔值只返回false,意味着我无法检查它是否真的设置为false,或者它正是JOOQ决定返回的内容.
我试过了:
if (record.field(MY_TABLE.SOME_BOOLEAN) != null) {
...
}
Run Code Online (Sandbox Code Playgroud)
但这不起作用,因为field()函数的返回值不为null,即使字段的值为.我也试过了
if (record.field(MY_TABLE.SOME_BOOLEAN).isNull()){
...
}
Run Code Online (Sandbox Code Playgroud)
但这不是一个有效的Java条件.
提前致谢!
我使用jOOQ设置了一个Java项目.目前,我们即将在Jenkins上创建CI管道.
理想情况下,我们不希望在repo上提交生成的代码,而是在构建过程中生成代码.但是,jOOQ需要连接到数据库才能生成代码.
第一种方法是允许Jenkins连接到数据库.如果我们被禁止访问Jenkins的数据库,我们应该考虑哪些方法?
任何评论或提示都受到欢迎,非常感谢.
我遇到了与 JOOQ 相关的问题。
---------
这是我的“设置”导致了这个问题。
桌子:
CREATE TABLE "public".xyz
(
id UUID NOT NULL,
CONSTRAINT pk_t_xyz PRIMARY KEY(id)
);
Run Code Online (Sandbox Code Playgroud)
使用 JOOQ 生成的字段是正确的
public final TableField<XYZRecord, UUID> ID = createField("id", org.jooq.impl.SQLDataType.UUID.nullable(false), this, "comment");
Run Code Online (Sandbox Code Playgroud)
UUID 来自 java.util.*
我的带有 UUID 的“自定义”POJO 来自java.util.*:
public class XYZ {
@NotNull
private UUID id;
public XYZ (@NotNull UUID id) {
this.id = id;
}
public UUID getId() {
return id;
}
}
Run Code Online (Sandbox Code Playgroud)
DSL配置:
@Configuration
public class DataSourceConfiguration {
@Qualifier("dataSource")
@Autowired
private DataSource dataSource;
@Bean
public …Run Code Online (Sandbox Code Playgroud) 我有一个表调用“ menu”的问题。此表使用 pid 保存父菜单项,null并使用pid= "parent id"保存其子菜单项。
表结构是:
CREATE TABLE security.menu (
id UUID NOT NULL,
pid UUID DEFAULT NULL,
url VARCHAR(100) DEFAULT NULL,
name VARCHAR(50)DEFAULT NULL,
seq NUMERIC DEFAULT NULL,
state NUMERIC DEFAULT 1,
created_at TIMESTAMP DEFAULT NULL,
updated_at TIMESTAMP DEFAULT NULL,
PRIMARY KEY (id)
);
Run Code Online (Sandbox Code Playgroud)
数据是:
我需要构建一个 JOOQ 查询以使用字段以树模式检索数据seq,id和pid.
我需要帮助来获取查询结果:
-Menu 1
-Sub Menu 1
-Menu 2
-Menu 3
-Menu 1
Run Code Online (Sandbox Code Playgroud)
上面的预期结果考虑了 seq 字段和字段 pid