当前位置: 首页 > 知识库问答 >
问题:

在ON中使用附加条件查询DSL左联接

焦兴为
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,但只是在零件号上连接。

检查生成的零件的库存可用性(除其他外)。左连接是必要的,因为我仍然需要没有库存条目的部件(例如新部件)。Left join将获取没有匹配库存余额的行,但在查询的where子句中添加month=month(CURRENT_DATE)等将删除没有库存余额的行号(因为它们没有年份/月份数据)。

出于同样的原因,< code>@Where和< code>@Filter会从结果零件列表中删除这些零件,因此不适用。遗憾的是,< code>@Filter和< code>@Where是我在Google和SO上搜索得到的唯一结果。(奇怪的是,即使在会话中启用了过滤器,过滤器也不会影响查询...)

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

提前感谢!

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

在浏览了这些文档之后,似乎证明querydsl的老博客有< code>leftJoin的< code>on()函数。为什么现在不再是这样了?

SQLQuery(或HibernateSQLQuery或其他一些变体)具有on()函数,但leftJoin()接受关系路径

更新 2 - 我们使用的是 2.9.0。使用 on() 会给出一个错误,就像它不存在一样...


共有1个答案

狄誉
2023-03-14
匿名用户

可以在查询DSL中使用 on(),包括最新版本。JPA 查询还支持 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);

JPA查询实现了JPQL通用查询接口,因此与其他接口一样,它具有所有必要的方法。

以下是来自 QueryDSL 最新版本的文档,使用 on() 示例进行左联接。

更新:

< code>on()是从QueryDsl 3.0.0版本开始引入的。因此,对于低于3.0.0的版本,它不可用。

我建议将您的版本至少升级到3.0.0,因为API比旧版本更强大。更重要的是,我强烈建议升级到最新的稳定版本(3.6.2),应该不会有任何问题,因为新API像以前一样支持一切,并具有附加功能。

更新2:正如评论中提到的@Cezille07,在旧版本中,on()有一个带有()的替代方案。正如我们从问题中看到的,with()后来被替换为on()

因此,对于带有()的旧版本,可以解决问题。这是一个有用的链接,其中包含更多详细信息。

 类似资料:
  • 问题内容: 我在Symfony2中使用Doctrine的querybuilder创建查询以获取实体。 我当前的代码如下所示: 现在,我可以使用它来获取所有页面,而不管它们是否已安装。但我只想将其加入页面即可(因此,如果有该应用程序的安装,但在其他页面上,则不会加入该安装)。如果我取消对where子句的引用,它将仅显示已安装该页面的应用程序。我希望该页面具有或没有安装的所有应用程序。 在SQL中,我

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

  • 问题内容: 我有两个实体:和。我正在使用Hibernate 3.6。 如何使用休眠标准实现这一目标,最重要的是,我必须将其用于分页。 而“我的道”如下所示以显示jqgrid中的“问题”列表 公共列表showHelpDeskIssues(DetachedCriteria dc,int from,int size){ 对于简短的解释,请参考此问题,如何使用struts2-jqgrid插件在jqgrid

  • 我有两个不相关的表,每一个都有字段email。我需要一个查询,它引入从第二个表的列,如果电子邮件匹配或将是空的,如果没有找到匹配。在SQL中,这很容易: 现在,它作为JPA查询工作,但我们使用的是查询DSL,因此我们开始转换它: 它工作,但现在我不知道如何实现排序和筛选的字段引入子查询。 是用于收集结果的POJO;是从自动生成的类。 问题是:如何使用查询DSL和JPA并避免本机SQL连接两个不相关

  • 我在将JPA与Querydsl和Hibernate一起用于数据存储管理时遇到了一个问题。示例模型如下: 在我的Spring MVC webapp中,我有一个包含用户参数和orderBy选择的搜索表单。orderBy选择可以是User属性或Category属性。orderBy参数存储为Map(f.e.{“login”:“adm”,{“firstname”:“john”}。搜索函数接收搜索参数(以字符

  • 为什么这个工会成员? 在Blaze persistence API中是否可以在没有联合的情况下获取查询?