我正在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)
)
提前致谢。
答案 0 :(得分:2)
jOOQ 3.12实现了#4473,允许将<div class="field required-field">
<ul class="job-manager-term-checklist job-manager-term-checklist-job_category">
<li id="job_listing_category-72" class="popular-category">
<label class="selectit">
<input value="72" type="radio" name="tax_input[job_listing_category][]" id="in-job_listing_category-72">1</label>
</li>
<li id="job_listing_category-73">
<label class="selectit">
<input value="73" type="radio" name="tax_input[job_listing_category][]" id="in-job_listing_category-73">2</label>
</li>
<li id="job_listing_category-75">
<label class="selectit">
<input value="75" type="radio" name="tax_input[job_listing_category][]" id="in-job_listing_category-75">3</label>
</li>
<li id="job_listing_category-76">
<label class="selectit">
<input value="76" type="radio" name="tax_input[job_listing_category][]" id="in-job_listing_category-76">4</label>
</li>
<li id="job_listing_category-80">
<label class="selectit">
<input value="80" type="radio" name="tax_input[job_listing_category][]" id="in-job_listing_category-80">5</label>
</li>
<li id="job_listing_category-86">
<label class="selectit">
<input value="86" type="radio" name="tax_input[job_listing_category][]" id="in-job_listing_category-86">6</label>
</li>
<li id="job_listing_category-98">
<label class="selectit">
<input value="98" type="radio" name="tax_input[job_listing_category][]" id="in-job_listing_category-98">7</label>
</li>
</ul>
<ul class="job-manager-term-checklist job-manager-term-checklist-job_category">
<li id="job_listing_category-72" class="popular-category">
<label class="selectit">
<input value="72" type="checkbox" name="tax_input[job_listing_category][]" id="in-job_listing_category-72">1</label>
</li>
<li id="job_listing_category-73">
<label class="selectit">
<input value="73" type="checkbox" name="tax_input[job_listing_category][]" id="in-job_listing_category-73">2</label>
</li>
<li id="job_listing_category-75">
<label class="selectit">
<input value="75" type="checkbox" name="tax_input[job_listing_category][]" id="in-job_listing_category-75">3</label>
</li>
<li id="job_listing_category-76">
<label class="selectit">
<input value="76" type="checkbox" name="tax_input[job_listing_category][]" id="in-job_listing_category-76">4</label>
</li>
<li id="job_listing_category-80">
<label class="selectit">
<input value="80" type="checkbox" name="tax_input[job_listing_category][]" id="in-job_listing_category-80">5</label>
</li>
<li id="job_listing_category-86">
<label class="selectit">
<input value="86" type="checkbox" name="tax_input[job_listing_category][]" id="in-job_listing_category-86">6</label>
</li>
<li id="job_listing_category-98">
<label class="selectit">
<input value="98" type="checkbox" name="tax_input[job_listing_category][]" id="in-job_listing_category-98">7</label>
</li>
</ul>
</div>
强制转换为新的,众所周知的记录类型ResultQuery<R1>
(可能包含ResultQuery<R2>
或Converter
配置)。
你可以写:
Binding
您不必采用全纯SQL。你可以这样做:
public List<Foo> findFoos(final DateTime time) {
return db.resultQuery(loadSqlQuery("FooRepository_findFoos"), time)
.coerce(FOO)
.fetch();
}
您必须确保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()