当前位置: 首页 > 知识库问答 >
问题:

我可以使用jOOQ将普通SQL查询映射到生成的pojo吗?

陶博涉
2023-03-14

我正在jOOQ中执行一个普通的sql查询,并希望将其映射到jOOQ生成的pojo中。我希望我能做这样的事情:

public List<Foo> findFoos(final DateTime time) {
    return db.resultQuery(loadSqlQuery("FooRepository_findFoos"), time)
             .fetchInto(Foo.class);
}

然而,这是行不通的。字段不会映射到构建Foo所需的类型,因为字段定义是DB列的定义,而不是FOO表的映射类型。目前我的代码看起来像这样:

public List<Foo> findFoos(final DateTime time) {
    return db.resultQuery(loadSqlQuery("FooRepository_findFoos"), time)
             .fetch(r -> {
                 return new Foo(
                         new FooId(r.getValue(FOO.ID, UUID.class)),
                         new BarId(r.getValue(FOO.BAR_ID, UUID.class))
                         //etc
                 );
             });
}

是否有某种方法可以为结果查询提供我正在获取的字段列表s,以便它能够正确映射结果?我希望在某个地方有这样的能力:

public List<Foo> findFoos(final DateTime time) {
    return db.resultQuery(loadSqlQuery("FooRepository_findFoos"), time)
             .fetch(FOO.fields())
             .into(Foo.class);
}

但是我找不到它。这是我忽略的东西还是不支持的?

作为参考,我使用普通sql的原因之一是为了让间隔在PostgreSQL中工作。例如(不是真正的查询)

select
    f.*
from foo f
where f.id not in (
    select
        x.foo_id
    from bar x
    where x.start_date >= (?::timestamptz - '1 year'::interval)
)

提前感谢。

共有1个答案

吕亮
2023-03-14

jOOQ 3.12实现了#4473,它允许强制执行ResultQuery

你可以写:

public List<Foo> findFoos(final DateTime time) {
    return db.resultQuery(loadSqlQuery("FooRepository_findFoos"), time)
             .coerce(FOO)
             .fetch();
}

您不必求助于所有普通SQL。您可以这样做:

public List<Foo> findFoos(final DateTime time) {
    return db.select(FOO.fields())
             .from("({0}) AS {1}", 
                  DSL.sql(loadSqlQuery("FooRepository_findFoos"), time),
                  DSL.name(FOO.getName()))
             .fetchInto(Foo.class);
}

您必须确保不生成任何模式名称,例如指定Settings.render模式=false

 类似资料:
  • 我有一个表tickets,其中插入ticket,并有一个createdBy字段,用于存储该记录创建者的UserId整数。在抓取过程中,我与users表和concat firstname和last name连接,并且我的DTO具有由连接的创建者名称创建的字段createdBy。如何映射派生字段?这是我的推荐信https://www.jooq.org/doc/3.13/manual/sql-execu

  • 我尝试使用的将本机SQL查询映射到POJO类,如下所示: 然后,为了在创建本机查询时使用声明的结果集映射,我通过它的名称引用它: 但这对我不起作用,我得到以下错误:

  • 我想我必须从POJO注册一个自定义转换器来记录。有人知道怎么做吗?

  • 问题内容: 我有以下JSON表示盐请求的服务器响应: 我尝试使用以下POJO映射它: 现在每次我这样做: 该为空。如何使用Gson将JSON映射到POJO?我的变量顺序对Gson映射重要吗? 问题答案: 我的变量顺序对Gson映射重要吗? 不,不是这样。 如何使用Gson将JSON映射到POJO? 它是 区分大小写 和JSON字符串键应该是相同的POJO类使用的变量名。 您可以使用@Seriali

  • 我有以下JSON来表示salt请求的服务器响应: 我尝试用以下POJO映射它: 每次我这样做: 为空。如何使用GSON将JSON映射到POJO?变量的顺序对Gson映射重要吗?