QueryDSL Left Join的附加条件为ON
是否可以在QueryDSL中执行以下查询?
SELECT p.*FROM parts_table p LEFT JOIN inventory_balance_table i ON
(p.part_no = i.part_no
AND i.month = MONTH(CURRENT_DATE)
AND i.year = YEAR(CURRENT_DATE));
库存余额存储每个零件号/月/年的库存数据;我只需要当前年份和月份的数据。
我已经基本离开了:
QPartsTable qParts = QPartsTable.partsTable;QInventoryBalance qBalance = QInventoryBalance.inventoryBalance;
JPAQuery q = new JPAQuery(em);
q.from(qParts).leftJoin(qParts.inventoryBalance, qBalance);
q.where(...);
List<Part> list = q.list(qParts);
这使正确的SQL,但只加入零件编号。
检查生成的零件的库存可用性(以及其他)。左连接是必要的,因为我仍然需要没有库存条目的零件(例如新零件)。左联接将获得那些没有匹配的库存余额的行,但是month
= MONTH(CURRENT_DATE)在查询的where子句中添加等等,将删除没有库存余额的行(因为它们没有年/月数据)。
出于同样的原因@Where
,@Filter
这些零件将从结果零件清单中删除,因此不适用。不幸的是@Filter
,这@Where
是我在Google和此处搜索中获得的唯一其他结果。(奇怪的是,即使在会话中启用了过滤器,过滤器甚至都不会影响查询…)
最简单的解决方案是我最初的问题:如何将上述SQL转换为QueryDSL?通常,是否可以向左联接的ON子句添加更多和/或自定义条件?有什么替代方法可以解决此问题?
提前致谢!
-后续问题和观察结果:(也许这完全应该是一个新问题?)
浏览完文档后,似乎较老的博客表明querydsl具有的on()
功能leftJoin
。为什么不再是这种情况?
SQLQuery
(或HibernateSQLQuery
或一些其它品种)具有上()函数,但leftJoin()接受RelationalPath<T>
,而不是一个EntityPath<T>
如JPAQuery
一样。将QClasses强制转换为似乎是不可能的RelationalPath
,所以这可能不是要走的路…
我们正在使用2.9.0。使用on()
会产生错误,就像它不存在一样……
回答:
可以on()
在QueryDSL中使用,包括最新版本。JPAQuery
也支持on()
谓词。
这样就可以实现,
QPartsTable qParts = QPartsTable.partsTable;QInventoryBalance qBalance = QInventoryBalance.inventoryBalance;
JPAQuery q = new JPAQuery(em);
q.from(qParts).leftJoin(qParts.inventoryBalance, qBalance).on(qBalance.month.eq(yourMonth).and(qBalance.year.eq(yourYear))).list(qParts);
JPAQuery
实现JPQLCommonQuery
接口,因此它具有所有必需的方法。
这是QueryDSL最新版本的文档,带有使用on()
示例的左连接。
on()
从QueryDsl 3.0.0版本开始引入。因此,对于低于3.0.0的版本,此功能不可用。
我建议您至少将版本升级到3.0.0,因为与旧版本相比,该API的功能更强大。甚至,我强烈建议您升级到最新的稳定版本(3.6.2),应该不会有任何问题,因为新的API支持以前的所有功能,并具有其他功能。
如评论中提到的@ Cezille07
,在较旧的版本中有with()
替代on()
。当我们从看问题,with()
已被替换on()
以后。
因此,对于较旧的版本,with()
就可以了。这是一个有用的链接,其中包含更多详细信息。
以上是 QueryDSL Left Join的附加条件为ON 的全部内容, 来源链接: utcz.com/qa/425783.html