加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – QueryDSL左加入ON中的附加条件

发布时间:2020-12-15 04:25:52 所属栏目:Java 来源:网络整理
导读:是否可以在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)); 库存余额存储每个部件号/月/年的库存数据;我只需
是否可以在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和@Filter会从结果部件列表中删除这些部件,但不适用.可悲的是@Filter和@Where是我在谷歌和SO搜索中获得的唯一其他结果. (奇怪的是,即使在会话中启用了过滤器,过滤器也不会影响查询…)

最简单的解决方案是我原来的问题:如何将上述SQL转换为QueryDSL?通常,是否可以向左连接的ON子句添加更多和/或自定义条件?这个问题的替代解决方案是什么?

提前致谢!

更新 – 后续问题和观察:(也许这应该是一个完全新的问题?)

在查看了文档之后,似乎较旧的博客证明了querydsl具有leftJoin的on()函数.为什么不再是这种情况?

SQLQuery(或HibernateSQLQuery或其他一些类型)具有on()函数,但leftJoin()接受RelationalPath< T>,而不是EntityPath< T>.就像JPAQuery那样.将QClasses转换为RelationalPath似乎是不可能的,所以这可能不是那种方式……

更新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实现了JPQLCommonQuery接口,因此其他人拥有所有必要的方法.

以下是QueryDSL最新版本的文档,其中左连接使用on()示例.

更新:

从QueryDsl 3.0.0版本开始引入on().因此,对于低于3.0.0的版本,它不可用.

我建议将您的版本升级到至少3.0.0,因为与旧版本相比,API要强大得多.更重要的是,我强烈建议升级到最新的稳定版本(3.6.2),不应该有任何问题,因为新API支持所有内容,具有其他功能.

更新2:
正如评论中提到的@ Cezille07,在旧版本中有on()替代on().正如我们从issue中看到的那样,with()稍后已被替换为on().

因此对于带有()的旧版本来说就是诀窍.这是一个有用的link,有更多细节.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读