我未能将此SQL转换为正在运行的jOOQ:
SELECT * FROM product p JOIN
( SELECT * FROM
(SELECT max(product_rev_id) as maxi
FROM product_rev
GROUP BY product_id) as a
JOIN product_rev as t ON t.product_rev_id = maxi
WHERE valid_to IS NOT NULL
) as z ON z.product_id = p.product_id
WHERE p.product_id in(1,2,3,4,5);
这里是SQL-Fiddle: http://sqlfiddle.com/#!9/d7816/1
我试了好几个小时,但它弄乱了所有的别名和jOOQ。
答案 0 :(得分:2)
将此类嵌套查询转换为jOOQ的最简单方法是将jOOQ子查询视为可组合的可重用元素。即。
// Assuming this
import static org.jooq.impl.DSL.*;
// Then write the inner-most derived table
Table<?> a = table(
select(max(PRODUCT_REV.PRODUCT_REV_ID).as("maxi"))
.from(PRODUCT_REV)
.groupBy(PRODUCT_REV.PRODUCT_ID)
).as("a");
// Then use a in the middle derived table
ProductRev t = PRODUCT_REV.as("t");
Table<?> z = table(
select()
.from(a)
.join(t).on(t.PRODUCT_REV_ID.eq(a.field("maxi", PRODUCT_REV.PRODUCT_REV_ID.getType())))
.where(t.VALID_TO.isNotNull())
).as("z");
// Finally, the outer-most query
Product p = PRODUCT.as("p");
DSL.using(configuration)
.select()
.from(p)
.join(z).on(z.field(PRODUCT_REV.PRODUCT_ID).eq(p.PRODUCT_ID))
.where(p.PRODUCT_ID.in(1, 2, 3, 4, 5))
.fetch();
从您的查询中,我怀疑唯一真正动态的部分是
WHERE p.product_id in (1, 2, 3, 4, 5)
这意味着您也可以在数据库中为查询的其余部分创建一个视图,并从您的客户端查询该视图。