簡體   English   中英

我可以使用jOOQ將純SQL查詢映射到生成的pojo中嗎?

[英]Can I use jOOQ to map a plain SQL query into a generated pojo?

我正在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
                 );
             });
}

有沒有什么方法可以提供結果查詢與我正在獲取的Field列表,以便它可以正確映射結果? 我希望在某個地方有能力做這樣的事情:

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)
)

提前致謝。

jOOQ 3.12解決方案

jOOQ 3.12實現了#4473 ,它允許將ResultQuery<R1>轉換為新的,眾所周知的記錄類型ResultQuery<R2> (可能使用ConverterBinding配置)。

你可以寫:

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

jOOQ 3.11及更早版本的解決方法

您不一定要使用全純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);
}

您必須確保FOO.fields()不生成任何模式名稱,例如通過指定Settings.renderSchema = false

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM