QueryDSL - 如何加入子查询的联合

2023-11-27

我正在使用 QueryDSL 构建一个 SQL 查询,其中包含多个联合起来的子查询。这是我的查询的基础:

QTransaction t = QTransaction.transaction;
query = query.from(t).where(t.total.gt(BigDecimal.ZERO));

然后,我有几个子查询来获取与事务关联的客户端名称。我已将示例减少到两个:

SQLSubQuery subQuery = new SQLSubQuery();
subQuery = subQuery.from(t).join(t.fk462bdfe3e03a52d4, QClient.client);
ListSubQuery clientByPaid = subQuery.list(t.id, bt.paidId, QClient.client.name.as("clientname"));

subQuery = new SQLSubQuery();
subQuery = subQuery.from(t).where(t.paidId.isNull(), t.clientname.isNotNull());
ListSubQuery clientByName = subQuery.list(t.id, Expressions.constant(-1L), t.clientname.as("clientname"));

如何将它们联合起来,并将联合与我的主查询连接起来?这是我目前的尝试:

subQuery = new SQLSubQuery();
subQuery = subQuery.from(subQuery.unionAll(clientByPaid,clientByName).as("namequery"));


query = query.leftJoin(subQuery.list(
            t.id, Expressions.path(Long.class, "clientid"),
                    Expressions.stringPath("clientname")),
                    Expressions.path(List.class, "namequery"));

这可以编译,但当我尝试时会在运行时生成无效的 SQLquery.count()。可能的错误:

  • 子查询并集的语法。
  • 之间的连接.as(...)命名子查询结果列的表达式以及子查询中使用的路径表达式leftJoin.

修复。主要的错误是我错过了on左连接中的子句,但为了表达on条件是我必须更加小心地命名子查询。该文档对构建访问子查询结果的路径进行了一些介绍,因此这里是示例。

联合中的第一个查询设置列名称:

SQLSubQuery subQuery = new SQLSubQuery();
subQuery = subQuery.from(t).join(t.fk462bdfe3e03a52d4, QClient.client);
ListSubQuery clientByPaid = subQuery.list(t.id.as("id"), t.paidId.as("clientid"),
                                QClient.client.name.as("clientname"));

subQuery = new SQLSubQuery();
subQuery = subQuery.from(t).where(t.paidId.isNull(), t.clientname.isNotNull());
ListSubQuery clientByName = subQuery.list(t.id, Expressions.constant(-1L), 
                                  t.clientname);

我现在需要构建一个路径表达式来引用我的内部查询。对于路径使用哪个类似乎并不重要,因此我选择了 Void 来强调这一点。

subQuery = new SQLSubQuery();
Path innerUnion = Expressions.path(Void.class, "innernamequery");
subQuery = subQuery.from(subQuery.union(clientByPaid,clientByName).as(innerUnion));

以及进一步的路径表达式来表达on条款。请注意,我加入了list()联合查询的每一列都使用innerUnion之前定义的路径。

Path namequery = Expressions.path(Void.class, "namequery");
query = query.leftJoin(subQuery.list(
                Expressions.path(Long.class, innerUnion, "id"),
                Expressions.path(Long.class, innerUnion, "clientid"),
                Expressions.stringPath(innerUnion, "clientname")),
              namequery)
          .on(t.id.eq(Expressions.path(Long.class, namequery, "id")));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QueryDSL - 如何加入子查询的联合 的相关文章

随机推荐

  • SignalR 2.0.2 创建持久连接

    我使用包管理器控制台将 SignalR 2 0 2 安装到我的 MVC 4 5 应用程序中 我做了连接配置的标准示例 namespace SignalRPersistent public class Startup public void
  • 如何在 C# 中使用 XMLREADER 从 XML 字符串读取特定元素

    我有 XML 字符串
  • 当我将 OS X 升级到 10.9 时,我的 applescript 不再工作

    以下代码尝试打开代理设置对话框 NSAppleScript a NSAppleScript alloc initWithSource tell application System Preferences nset current pane
  • jQuery - 垂直向上切换(即不是向下)

    我需要创建一个向上而不是向下动画的切换 换句话说 与 正常 切换相反 也许更简单的是 切换应该在菜单项 它是一个菜单 上方向上滑动以变得可见 而不是像普通的 SlideToggle 等那样向下滑动 我已经快到了 var opened fal
  • SYSMALLOC:断言失败 - 关于如何有效调试的任何想法?

    我的服务器守护进程在大多数机器上运行良好 但在我得到的一台机器上 malloc c 3074 sYSMALLOc Assertion old top mbinptr char av gt bins 1 1 2 builtin offseto
  • Java继承

    为什么最后打印的是 我是一个儿童班 public class Parent String parentString public Parent System out println Parent Constructor public Par
  • jQuery 无限函数执行

    我们想知道是否可以有一个使用 jQuery 的函数来检查多个元素 并根据通过单击分配给它们的类型来执行其他函数 基本上 这是一个将永远运行的函数 而用户不会刷新页面 这个想法不是依赖事件点击来执行功能 而是依赖分配给特定元素的类 例如 td
  • 如何在 Java 日期和儒略日数之间进行转换? [关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 Java 怎样才能Date被转换成double代表儒略日 如何将儒略日数转换为JavaD
  • 如何更改 xtable markdown 中某些单元格的颜色?

    我有一个名为 j 的数据框 dput j structure list Trans c 89 8 3337 NA 97 55 NA 3558 7 NA 4290 6 NA 65 95 94 55 3495 9 CPU c 6 938 79
  • 无法在 Google App Engine 上部署 java 项目

    我已在 Google App Engine 上创建了一个项目 但无法使用项目 id 部署该项目 我的项目 id 以下是发生问题的详细信息 您选择的应用程序 ID 我的项目 ID 不存在 去http cloud google com cons
  • 重新加载 Bootstrap 自定义

    On http getbootstrap com customize 可以创建和下载自定义引导程序配置 下载中包含一个名为 config json 的文件 是否可以以某种方式使用该文件来重新填充值并调整自定义引导配置 如果没有 有人知道为什
  • CodeIgniter 调用模型如何查看?

    我有一个包含数据表的视图 该数据是在模型上生成的 我如何在我的视图中调用此模型以发布在我的视图上 这相当于我想在 php 上使用 codeIgniter 做的事情 while row mysql fetch array requet cod
  • Laravel 每日日志使用错误的权限创建

    我有一个使用 php artisan 运行的脚本 带有rootuser 有时它会导致每日日志文件在apache之前创建www data用户这样做 这意味着当真正的用户使用我的网络应用程序时 我收到文件夹权限错误 无法打开流 权限被拒绝 我将
  • int (*p) [4]?

    int p 4 p 指针是指向 4 个整数的数组吗 或者是什么 以及如何为该指针调用 新 p 指针是指向 4 个整数的数组吗 Correct 我怎样才能为这个指针调用 new 例如 p new int 7 4
  • Canvas getImageData() 以获得最佳性能。提取所有数据还是一次提取一个数据?

    我需要扫描画布图像中的每个像素 并对颜色等进行一些处理 为了获得最佳性能 我是否应该一次性获取所有数据并通过数组对其进行处理 或者我应该在处理每个像素时调用它 所以基本上 data context getImageData x y heig
  • jQuery ajax 循环内问题

    这个js循环脚本总是获取jquery ajax函数内ui item的最后一个值 如何捕获每次迭代的正确值 for var i 0 i lt split files cb value holder length 1 i var split v
  • 是否可以让 Jackson 将嵌套对象序列化为字符串

    鉴于这些课程 Value private static class Message private final String type private final MyType message Value public class MyTy
  • 您可以以其他用户身份使用 files.upload 将文件上传到 Slack API 吗?

    我正在尝试找到一种方法 让应用程序通过 Slack API 将文本片段发布到我们的支持渠道 使用 files upload 方法 我可以创建一个文本片段并将其与频道共享 但该帖子似乎来自我 因为用于验证请求的令牌是我的 我正在寻找一种方法来
  • 分配以数字结尾的 CSS 字体系列

    所以看来 如果我分配一个以数字结尾的字体系列 它就不会粘住 a document createElement div a style fontFamily Arial 那么 a 就是 div style font family Arial
  • QueryDSL - 如何加入子查询的联合

    我正在使用 QueryDSL 构建一个 SQL 查询 其中包含多个联合起来的子查询 这是我的查询的基础 QTransaction t QTransaction transaction query query from t where t t