是否可以在 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
and @Filter
将从结果零件列表中删除这些零件并且不适用。可悲的是@Filter
and @Where
这是我在 Google 和此处搜索时得到的唯一其他结果。 (奇怪的是,即使在会话中启用了过滤器,过滤器甚至不会影响查询......)
最简单的解决方案是我原来的问题:如何将上面的 SQL 转换为 QueryDSL?一般来说,是否可以向左连接的 ON 子句添加更多和/或自定义条件?这个问题有哪些替代解决方案?
提前致谢!
Update- 后续问题和观察:(也许这应该完全是一个新问题?)
浏览完文档后,似乎演示 querydsl 的旧博客有on()
函数为leftJoin
的。为什么现在不再是这样了?
SQLQuery
(or HibernateSQLQuery
或其他一些)有 on() 函数,但 leftJoin() 接受RelationalPath<T>
,不是一个EntityPath<T>
as JPAQuery
做。似乎不可能将 QClasses 转换为RelationalPath
,所以这可能不是要走的路......
Update 2- 我们正在使用 2.9.0。使用on()
给出一个错误,就像它不存在一样......