Cez*_*e07 4 java left-join querydsl
是否可以在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));
Run Code Online (Sandbox Code Playgroud)
库存余额存储每个部件号/月/年的库存数据; 我只需要当前年份和月份的数据.
我已经得到了基本的左连接:
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);
Run Code Online (Sandbox Code Playgroud)
这使得正确的sql,但只加入了部件号.
检查生成的零件的库存可用性(以及其他内容).左连接是必要的,因为我仍然需要没有库存条目的零件(例如新零件).左连接将获得没有匹配库存余额的那些,但添加month = MONTH(CURRENT_DATE)等等查询的where子句会删除没有库存余额的行(因为它们没有年/月数据).
出于同样的原因@Where,@Filter将从结果零件清单中删除这些零件,并且不适用.可悲的是@Filter,这@Where是我在谷歌和SO搜索中获得的唯一其他结果.(奇怪的是,即使在会话中启用了过滤器,过滤器也不会影响查询...)
最简单的解决方案是我原来的问题:如何将上述SQL转换为QueryDSL?通常,是否可以向左连接的ON子句添加更多和/或自定义条件?这个问题的替代解决方案是什么?
提前致谢!
更新 - 后续问题和观察:(也许这应该是一个完全新的问题?)
在查看了文档之后,似乎较旧的博客证明了querydsl具有的on()功能leftJoin.为什么不再是这种情况?
SQLQuery(或HibernateSQLQuery其他一些变种)具有on()函数,但leftJoin()接受RelationalPath<T>,而不是EntityPath<T>as JPAQuery.似乎不可能将QClasses转换为a RelationalPath,所以这可能不是要走的路......
更新2 - 我们使用的是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);
Run Code Online (Sandbox Code Playgroud)
JPAQuery实现JPQLCommonQuery接口,与其他人一样,它具有所有必要的方法.
以下是来自QueryDSL最新版本的文档,其中左连接使用on()示例.
更新:
on()自QueryDsl 3.0.0版本以来一直在介绍.因此,对于低于3.0.0的版本,它不可用.
我建议将您的版本升级到至少3.0.0,因为与旧版本相比,API要强大得多.更重要的是,我强烈建议升级到最新的稳定版本(3.6.2),不应该有任何问题,因为新API支持所有内容,具有其他功能.
更新2:
正如评论中提到的@ Cezille07 ,在旧版本中有with()另一种选择on().正如我们从问题中看到的,with()已经被on()后来取代了.
所以对于旧版本来说with()就是诀窍.这是一个有用的链接,包含更多细节.
| 归档时间: |
|
| 查看次数: |
20940 次 |
| 最近记录: |