Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java QueryDSL在ON中使用附加条件进行左连接_Java_Left Join_Querydsl - Fatal编程技术网

Java QueryDSL在ON中使用附加条件进行左连接

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

可以在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);
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
中不存在。