当前位置: 首页 > 面试题库 >

QueryDSL Left Join的附加条件为ON

孙渝
2023-03-14
问题内容

是否可以在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是我在Google和此处搜索中获得的唯一其他结果。(奇怪的是,即使在会话中启用了过滤器,过滤器甚至都不会影响查询…)

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

提前致谢!

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

浏览完文档后,似乎较老的博客表明querydsl具有的on()功能leftJoin。为什么不再是这种情况?

SQLQuery(或HibernateSQLQuery或一些其它品种)具有上()函数,但leftJoin()接受RelationalPath<T>,而不是一个EntityPath<T>JPAQuery一样。将QClasses强制转换为似乎是不可能的RelationalPath,所以这可能不是要走的路…

更新2- 我们正在使用2.9.0。使用on()会产生错误,就像它不存在一样……


问题答案:

可以on()在QueryDSL中使用,包括最新版本。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支持以前的所有功能,并具有其他功能。

更新2: 如评论中提到的@ Cezille07
,在较旧的版本中有with()替代on()。当我们从看问题,with()已被替换on()以后。

因此,对于较旧的版本,with()就可以了。这是一个有用的链接,其中包含更多详细信息。



 类似资料:
  • 我有冬眠实体: 组织(有2个ManyTo多人映射(常规人员列表和特权人员列表)) 人 有没有办法使HQL等效于此查询? 我不知道如何在最后一个左连接中创建条件p.id=op.person\u id或p.id=opp.person\u id。我看到了带有关键字的,但它创建了带有“AND”的条件,而不是“OR”。

  • 我有一个问题与列表视图。列表视图太长,它的一部分出现在窗口之外,但我不能附加滚动条。我尝试了许多不同的组合。我认为这个问题在于高度参数,但如果删除它,列表视图只显示第一个条目。 有什么方法可以让它滚动吗?

  • 我正在使用Meteor并尝试将pdf附加到电子邮件中。我目前将pdf作为base 64字符串返回给客户端,该字符串在新窗口中打开并显示pdf。我想以pdf的形式将base 64附加为电子邮件附件。 邮寄服务器方法: 将base64字符串返回给客户端的代码段: 当前显示pdf的客户端代码: 为了将base64字符串作为pdf附件附加,我应该做些什么?我似乎无法获得流星邮件发送的数据,因为我收到了错误

  • 有可能在QueryDSL中执行以下查询吗? 库存余额存储每个零件号/月/年的库存数据;我只需要当前年份和月份的数据。 我已经得到了基本的左连接: 这就产生了正确的sql,但只是在零件号上连接。 检查生成的零件的库存可用性(除其他外)。左连接是必要的,因为我仍然需要没有库存条目的部件(例如新部件)。Left join将获取没有匹配库存余额的行,但在查询的where子句中添加等将删除没有库存余额的行号

  • 如何使用Laravel的查询构建器构建相同的查询(如果可能的话)是使用Eloquent更好,还是应该使用DB::Select?

  • 我在Laravel做项目。我有名为'User.php'的模型,在这里我想设置$追加变量取决于条件。在数据库中,我以键属性格式存储值。 > 其他名为“user_attributes_master”的表,其中包含“头像”、“主题”等列。 和其他名为user_attribute_values的表,其中包含id、user_id和att_id等列(user_attributes_master表的主键) us