[英]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實現了#4473 ,它允許將ResultQuery<R1>
轉換為新的,眾所周知的記錄類型ResultQuery<R2>
(可能使用Converter
或Binding
配置)。
你可以寫:
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);
}
您必須確保FOO.fields()
不生成任何模式名稱,例如通過指定Settings.renderSchema = false
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.