【发布时间】:2015-05-05 03:52:24
【问题描述】:
是否可以在 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,但仅加入零件号。
检查生成的零件是否有库存(除其他外)。左连接是必要的,因为我仍然需要还没有库存条目的零件(例如新零件)。左连接将获得那些没有匹配库存余额的行,但在查询的 where 子句中添加 month = MONTH(CURRENT_DATE) 等会删除没有库存余额的行(因为它们没有年/月数据)。
出于同样的原因@Where 和@Filter 将从生成的部件列表中删除这些部件并且不适用。可悲的是,@Filter 和 @Where 是我在 Google 和 SO 上搜索得到的唯一其他结果。 (奇怪的是,即使在会话中启用了过滤器,过滤器也不会影响查询......)
最简单的解决方案是我最初的问题:如何将上述 SQL 转换为 QueryDSL?一般来说,是否可以向左连接的 ON 子句添加更多和/或自定义条件?这个问题的替代解决方案是什么?
提前致谢!
更新 - 一个后续问题和一个观察:(也许这应该完全是一个新问题?)
查看文档后,似乎较早的展示 querydsl 的博客具有 leftJoin 的 on() 函数。为什么现在不再这样了?
SQLQuery(或 HibernateSQLQuery 或其他一些变体)具有 on() 函数,但 leftJoin() 接受 RelationalPath<T>,而不是 EntityPath<T> 像 JPAQuery 那样。将 QClasses 转换为 RelationalPath 似乎是不可能的,所以这可能不是要走的路……
更新 2 - 我们使用的是 2.9.0。使用on() 会报错,就像它不存在一样...
【问题讨论】:
-
那是因为
2.9.0中不存在。