Java QueryDSL在ON中使用附加条件进行左连接
可以在QueryDSL中执行以下查询吗Java QueryDSL在ON中使用附加条件进行左连接,java,left-join,querydsl,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)); 库存余额存储每个零件号/月/年的库存数据;我只需要当前年度和月份的数据 我已经得到了基本的左连接: QP
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);
QPartsTable qParts=QPartsTable.partsTable;
QInventoryBalance qBalance=QInventoryBalance.inventoryBalance;
JPAQuery q=新的JPAQuery(em);
q、 from(qParts).leftJoin(qParts.inventoryBalance,qBalance);
q、 其中(…);
列表=q.List(qParts);
这将生成正确的sql,但仅连接零件号
检查结果零件的库存可用性(除其他外)。左连接是必要的,因为我仍然需要没有库存条目的零件(例如新零件)。Left join将获得那些没有匹配库存余额的行,但是将month=month(当前_日期)
等添加到查询的where子句中会删除没有库存余额的行(因为它们没有年/月数据)
出于同样的原因,@其中
和@过滤器
将从生成的零件列表中删除这些零件,因此不适用。遗憾的是,@Filter
和@Where
是我在谷歌和这里搜索得到的唯一其他结果。(奇怪的是,即使在会话中启用了过滤器,过滤器也不会影响查询…)
最简单的解决方案是我最初的问题:如何将上面的SQL转换成QueryDSL?通常,是否可以向左联接的ON子句添加更多和/或自定义条件?这个问题的替代解决方案是什么
提前谢谢
更新-后续问题和观察:(也许这应该是一个全新的问题?) 翻阅文档后,老博客似乎已经为
leftJoin
提供了on()
功能。为什么情况不再如此
SQLQuery
(或HibernateSQLQuery
或其他变体)具有on()函数,但leftJoin()接受RelationalPath
,而不像JPAQuery
那样接受EntityPath
。似乎不可能将QClass强制转换为关系路径
,因此这可能不是解决问题的方法
更新2-我们正在使用2.9.0。在()上使用
on
会产生错误,就像它不存在一样 可以在QueryDSL中使用on()
,包括最新版本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
实现了jpqlcomonquery
接口,因此它与其他接口一样具有所有必要的方法
下面是使用on()
示例的最新版本的左连接文档
更新:
从QueryDsl 3.0.0版本开始,就引入了on()
。因此,对于低于3.0.0的版本,它不可用
我建议至少将您的版本升级到3.0.0,因为与旧版本相比,API的功能更强。更重要的是,我强烈建议升级到最新的稳定版本(3.6.2),这应该不会有任何问题,因为新的API像以前一样支持一切,并具有附加功能
更新2:
正如@Cezille07在评论中提到的,在旧版本中,with()
替代了on()
。正如我们从中看到的,with()
已在稍后被替换为on()
因此,对于较旧的版本,
with()
。下面是一个有用的详细信息。我们使用的是querydsl 2.9.0。它就在那个链接中,但是当我在(…)上使用
时,它出现了一个错误“上的方法(BooleanExpression)对于类型JPAQuery是未定义的”。on甚至没有出现在JPAQuery函数的自动完成列表中。现在我们知道了问题:)2.9.0不支持on
表达式,您应该至少将一个版本升级到3.0.0。请看一下我编辑过的答案,我在那里包括了这些信息。希望有帮助。谢谢你的信息!经过一些挖掘,对于旧版本,有一个函数with
,它完成了on
的功能。请你加上这一点,我会接受你的回答。非常有用的信息!谢谢,我已经为未来的访客补充了这一点。伟大的发现,我不知道。那是因为它在2.9.0
中不存在。