QueryDSL 左连接,ON 中带有附加条件

2023-11-27

是否可以在 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 and @Filter将从结果零件列表中删除这些零件并且不适用。可悲的是@Filter and @Where这是我在 Google 和此处搜索时得到的唯一其他结果。 (奇怪的是,即使在会话中启用了过滤器,过滤器甚至不会影响查询......)

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

提前致谢!


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

浏览完文档后,似乎演示 querydsl 的旧博客有on()函数为leftJoin的。为什么现在不再是这样了?

SQLQuery (or HibernateSQLQuery或其他一些)有 on() 函数,但 leftJoin() 接受RelationalPath<T>,不是一个EntityPath<T> as JPAQuery做。似乎不可能将 QClasses 转换为RelationalPath,所以这可能不是要走的路......


Update 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()例子。

Update:

on()从 QueryDsl 3.0.0 版本开始引入。因此对于 3.0.0 以下的版本它不可用。

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

更新2:正如@Cezille07 在评论中提到的,有一个with()替代品on(),在旧版本中。正如我们从issue , with()已替换为on()稍后的。

所以对于旧版本with()就可以了。这里有一个有用的link有更多细节。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QueryDSL 左连接,ON 中带有附加条件 的相关文章

随机推荐

  • Spring Data JPA“OR”与单个参数

    是否可以有一个像这样的 Spring Data JPA 存储库方法 User findByEmailOrUserName String usernameOrEmail 上面的方法名称不起作用 因为 Spring Data JPA 在尝试查找
  • 如何在 Ruby 中递增/递减一个字符以获取所有可能的值?

    我有一个长度为一个字符的字符串 可以是任何可能的字符值 irb main 001 0 gt x0 gt u0000 我认为这可能有效 irb main 002 0 gt x0 1 SyntaxError irb 2 syntax error
  • v-for 项目内部的切换会影响整个列表,如何使每个切换仅影响包含的列表项目?

    我正在使用 v for 循环制作一个项目列表 在循环的每个项目内都有一个带有单击事件方法的按钮 显示描述文本 当我单击按钮时 它应该仅在其自己的项目内部切换 但它会影响 v for 列表中的所有元素 那么 如何制作一个只影响其自身项目的切换
  • 在windows上安装scipy时出错

    我正在 Windows 机器和 2 7 版本的 python 上工作 我已经安装了 numpy 现在我正在尝试安装 scipy 我尝试使用简易安装命令并下载 zip 文件然后运行 setup py 文件来安装它 当我尝试通过 easy in
  • 如何在 Cordova Android 应用程序中嵌入 Youtube 视频

    我是 Cordova 应用程序开发的新手 我有一个 Youtube URL 我想将视频嵌入到 Cordova 应用程序中 我尝试过使用 YouTube Api JS 库 和 iframe 来制作它 我需要做什么才能在 Android 应用程
  • Chrome iFrame 阻止 HTTPS 重定向

    我有一个父网站 https a company com 其中包含一个带有 HTTPS 内容的 iframe https b company com foo 到目前为止一切都很顺利 但是 当发生重定向以在同一域上加载不同的路由时 Chrome
  • 如何使用 OpenGL 3.x VBO 渲染动态世界?

    尽管 OpenGL 3 x 本身的最新参考文献似乎很少 但 OpenGL 的实际低级操作相对简单 然而 我在试图概念化如何操纵 VBO 来渲染动态世界时遇到了严重的困难 显然旧的立即模式方式不适用 但是从那里我该去哪里呢 我是否编写某种场景
  • 单例模式的替代方案?

    我使用 ASP NET 和 C 担任 Web 开发人员已经有一段时间了 我想尝试通过使用最佳实践来提高我的技能 我有一个网站 我想一次性加载设置 然后在需要的地方引用它 所以我做了一些研究 50 的开发人员似乎正在使用单例模式来做到这一点
  • 如何通过用户的XAML动态添加控件到UserControl?

    我想创建一个包含 TextBlock 和 StackPanel 的用户控件 该控件将允许用户在 XAML 中动态地将他 她自己的控件添加到用户控件 以下是我的 UserControl 的示例 XAML
  • 如何从进程 ID 获取 X11 窗口?

    在 Linux 下 我的 C 应用程序使用 fork 和 execv 来启动 OpenOffice 的多个实例 以便查看一些 powerpoint 幻灯片 这部分有效 接下来 我希望能够将 OpenOffice 窗口移动到显示屏上的特定位置
  • 使用 NumPy datetime64 进行矢量化年/月/日运算

    我想从年 月和日的一维向量创建 NumPy datetime64 对象的向量 并且还可以反向操作 即从每日 datetime64 向量中提取年 月或日的向量 我正在使用 NumPy 1 7 0b2 例如 假设 years 1990 1992
  • 使用 RxJava 和 Retrofit 链接两个 Web 服务调用

    我正在使用 RxJava 和 Retrofit 我的基本要求是 我想链接两个 api 调用 这将被一个接一个地调用 从第一个 api 收到的响应在调用第二个 api 时用作输入 在阅读了互联网上的一些内容后 我用平面图来实现这一点 在执行此
  • Rails - 连接后 Distinct ON

    我正在使用 Rails 4 2 和 PostgreSQL 我有一个Product模型和一个Purchase模型与Product has many Purchases 我想找到最近购买的独特产品 最初我尝试过 Product joins pu
  • Google Apps 脚本 - 获取用户电子邮件地址

    我有一个在 Google 网站上运行的 Google Apps 脚本项目 该网站要求用户登录 并且仅向该 G suite 域中的用户开放 我拥有的脚本用于允许用户进行投票 进入发言者队列以及执行一些其他任务 目前 后台的所有功能都可以作为我
  • 解释 Scala 类型级编程中使用的“LowPriorityImplicits”模式

    当查看一些 Scala 库的源代码时 例如无形的 我经常发现名为LowPriorityImplicits 您能解释一下这个模式吗 解决的问题是什么 该模式是如何解决的 该模式允许您拥有隐式层次结构 避免编译器产生与歧义相关的错误 并提供一种
  • Log4Net 不写入数据库

    我已经检查了连接字符串 我从服务器资源管理器获取它 我检查了 log4net 配置中的 commandText 我已经检查了数据库权限 集成安全性很好并且在 log4net 类之外工作 我已经检查了存储库的配置属性 它已配置 它发现配置文件
  • 如何以编程方式比较 mp3

    我喜欢能够以编程方式比较 mp3 问题我不知道是什么 标头 直方图 渠道 有人有这方面的经验吗 I wrote 我的硕士论文关于音频指纹识别 本文列出了一些针对比较音乐听起来的问题的开源解决方案 并提供了它们之间的性能比较 可能有点矫枉过正
  • 如何更改 Fabric.js 对象的值?

    我有一个 Fabric jscanvas 我还有一个 JavaScript 它有一个在按下按钮时调用的函数 我知道如何获取活动对象 canvas getActiveObject 但我不知道如何更改其中的值 而不必进行克隆并删除原始值 我之所
  • ios 中联系人缺少一些必需的关键描述符

    我已使用以下方法检索所有联系人 void getAllContacts void NSArray array handler CNAuthorizationStatus status CNContactStore authorization
  • QueryDSL 左连接,ON 中带有附加条件

    是否可以在 QueryDSL 中执行以下查询 SELECT p FROM parts table p LEFT JOIN inventory balance table i ON p part no i part no AND i mont