标签: jooq

使用 JOOQ 分页

我正在尝试使用 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 本书开始?

最好的问候,马坦

java mysql pagination jooq

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

如何将对象转换为 Jooq JSON

我有一个字符串(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)

json wrapper jackson jooq

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

Jooq distinct 或 countDistinct 多于一列

我发现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),但它会“区分”所有列,这不是我想要的。

java mysql distinct aggregate-functions jooq

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

jOOQ使用本地时区偏移量存储时间戳

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创建时间戳不是在当地时间?

postgresql timezone timestamp jdbc jooq

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

JOOQ非utf8编码问题

有没有办法指定用于从JOOQ生成SQL查询的编码?我们有非UTF-8编码的oracle数据库,并且生成的相等字符串条件查询包含UTF-8字符

java jooq

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

为什么我无法使用Jooq的into方法获取类中的数据库字段值?

这是我对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)

java javabeans jooq

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

JOOQ检查Record对象中的空字段?

我在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条件.

提前致谢!

java sql jooq

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

jOOQ持续集成方法

我使用jOOQ设置了一个Java项目.目前,我们即将在Jenkins上创建CI管道.

理想情况下,我们不希望在repo上提交生成的代码,而是在构建过程中生成代码.但是,jOOQ需要连接到数据库才能生成代码.

第一种方法是允许Jenkins连接到数据库.如果我们被禁止访问Jenkins的数据库,我们应该考虑哪些方法?

任何评论或提示都受到欢迎,非常感谢.

java continuous-integration jooq jenkins

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

JOOQ - 列“id”的类型为 uuid,但表达式的类型为不同的字符

我遇到了与 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)

java postgresql spring jooq

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

JOOQ 查询层次结构

我有一个表调用“ 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,idpid.

我需要帮助来获取查询结果:

-Menu 1
     -Sub Menu 1
-Menu 2
-Menu 3
-Menu 1
Run Code Online (Sandbox Code Playgroud)

上面的预期结果考虑了 seq 字段和字段 pid

java sql postgresql jooq

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