我有两张这样的表:
+------------------+ +------------------+
| CHANGESET | 1 N | DECISION |
| |--------------| |
| | | |
+------------------+ +------------------+
我需要根据一些标准获取CHANGESET记录列表,并且只加入一条DECISION记录,最后一条记录基于dateTimeStamp。
所以,我有这样的查询:
SELECT * FROM CHANGESET ch
LEFT JOIN (
SELECT * FROM
(
SELECT * FROM CHANGESETDECISION
ORDER BY DECISIONTIMESTAMP DESC
)
WHERE ROWNUM = 1
) chd
ON chd.CHANGESETID = ch.ID
WHERE ch.CHANGESETSTATUSID IN ('DRAFT','APPROVED')
-- AND some other criteria...
ORDER BY ch.ID;
或者我可以使用以下查询获得相同的结果:
SELECT * FROM
(
SELECT
RANK()
OVER (
PARTITION BY CH.ID
ORDER BY CHD.DECISIONTIMESTAMP ) rnk,
ch.*,
chd.DECISIONTIMESTAMP,
chd.CHANGESETID
FROM CHANGESET ch
LEFT JOIN CHANGESETDECISION chd ON chd.CHANGESETID = ch.ID
) WHERE rnk = 1;
我需要的是在QueryDSL中编写它。我试过这样的事情:
private SQLQuery getLastApproved() {
return createQuery()
.from(CHANGESETDECISION)
.limit(1)
.orderBy(new OrderSpecifier<>(Order.DESC, CHANGESETDECISION.decisiontimestamp))
.where(CHANGESETDECISION.approved.eq(COMMON_YES_VALUE));
}
并加入:
createQuery()
.from(CHANGESET)
.leftJoin(getLastApproved())
.where(CHANGESETDECISION.decisiontimestamp.isNull().or(CHANGESETDECISION.decisiontimestamp.eq(getTimestamp())))
.list();
但它根本不起作用,因为SQLQuery
或SQLSubQuery
不是基于EntityPath<?>
。
您对如何实现它有什么建议吗?
在项目中,我们使用的是QueryDSL 3.6.9。
答案 0 :(得分:0)
更新后使用querydsl 3.6.9
使用leftJoin
方法public Q leftJoin(SubQueryExpression<?> target, Path<?> alias)
举例说明如何使用querydsl 3.6.9。
PathBuilder<String> alias = new PathBuilder<>(String.class, "alias");
query.from(dual)
.leftJoin(new SQLSubQuery()
.from(dual)
.list(dual.dummy), alias)
.on(alias.get(dual.dummy).eq(dual.dummy));