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

时间:2015-12-01 10:55:34

标签: java postgresql jooq

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

提前致谢。

1 个答案:

答案 0 :(得分:2)

jOOQ 3.12解决方案

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

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

您不必采用全纯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()