QueryDSL Left Join with additional conditions in ON
QueryDSL Left Join with additional conditions in ON
是否可以在 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));
库存余额存储每个零件的库存数据number/month/year;我只需要当前年份和月份的数据。
我已经掌握了基本的左连接:
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)
等会删除没有库存余额的行(因为它们没有 year/month 数据)。
出于同样的原因,@Where
和 @Filter
将从生成的部件列表中删除这些部件并且不适用。遗憾的是,@Filter
和 @Where
是我在 Google 和此处进行搜索时获得的唯一其他结果。 (奇怪的是,即使在会话中启用了过滤器,过滤器也不会影响查询...)
最简单的解决方案是我最初的问题:如何将上面的 SQL 转换为 QueryDSL?一般来说,是否可以在left join的ON子句中多加and/or个自定义条件?这个问题的替代解决方案是什么?
提前致谢!
更新 - 后续问题和观察:(也许这应该完全是一个新问题?)
查看文档后,似乎显示 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()
示例。
更新:
on()
从QueryDsl 3.0.0版本开始引入。所以对于3.0.0以下的版本是不可用的。
我建议至少将您的版本升级到 3.0.0,因为 API 与旧版本相比要强大得多。更重要的是,我强烈建议升级到最新的稳定版本 (3.6.2),应该不会有任何问题,因为新 API 像以前一样支持所有内容,并具有附加功能。
更新二:
正如@Cezille07 在评论中提到的,在旧版本中有 on()
的 with()
替代方案。正如我们从 issue 中看到的那样, with()
稍后已被 on()
取代。
所以对于旧版本 with()
就可以了。这是一个有用的 link,包含更多详细信息。
是否可以在 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));
库存余额存储每个零件的库存数据number/month/year;我只需要当前年份和月份的数据。
我已经掌握了基本的左连接:
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)
等会删除没有库存余额的行(因为它们没有 year/month 数据)。
出于同样的原因,@Where
和 @Filter
将从生成的部件列表中删除这些部件并且不适用。遗憾的是,@Filter
和 @Where
是我在 Google 和此处进行搜索时获得的唯一其他结果。 (奇怪的是,即使在会话中启用了过滤器,过滤器也不会影响查询...)
最简单的解决方案是我最初的问题:如何将上面的 SQL 转换为 QueryDSL?一般来说,是否可以在left join的ON子句中多加and/or个自定义条件?这个问题的替代解决方案是什么?
提前致谢!
更新 - 后续问题和观察:(也许这应该完全是一个新问题?)
查看文档后,似乎显示 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()
示例。
更新:
on()
从QueryDsl 3.0.0版本开始引入。所以对于3.0.0以下的版本是不可用的。
我建议至少将您的版本升级到 3.0.0,因为 API 与旧版本相比要强大得多。更重要的是,我强烈建议升级到最新的稳定版本 (3.6.2),应该不会有任何问题,因为新 API 像以前一样支持所有内容,并具有附加功能。
更新二:
正如@Cezille07 在评论中提到的,在旧版本中有 on()
的 with()
替代方案。正如我们从 issue 中看到的那样, with()
稍后已被 on()
取代。
所以对于旧版本 with()
就可以了。这是一个有用的 link,包含更多详细信息。