使用构造函数表达式和 JPQL 的复合 DTO 投影

2024-02-23

我试图通过提供完全限定的名称从 db 选择特定列到复合类 DTO 中。

 @Data
    public class Temp {
    String dName;
    Temp2 value;

    public Temp( String dName, Temp2 value) {
        this.dName = dName;
        this.value = value;
    }
    @Data
    public static class Temp2 {
        Integer day;
        public Temp2(Integer day) {
            this.day = day;
        }
    }
 }

查询: SELECT new com.pojo.Temp ( t1.displayName, new com.pojo.Temp.Temp2 (t3.day)) FROM table1 t1 JOIN table2 t2 ON t1.bId = t2.id 并左连接 table3 t3 ON t1.g_id = t2.id

Error: `[2018-11-06 12:02:54] [main] ERROR o.h.hql.internal.ast.ErrorCounter.reportError -  [  ] line 1:64: unexpected token: ,
[2018-11-06 12:02:54] [main] ERROR o.h.hql.internal.ast.ErrorCounter.reportError -  [  ] line 1:64: unexpected token: ,
antlr.NoViableAltException: unexpected token: ,
    at org.hibernate.hql.internal.antlr.HqlBaseParser.primaryExpression(HqlBaseParser.java:1009)
    at org.hibernate.hql.internal.antlr.HqlBaseParser.atom(HqlBaseParser.java:3549)
    at org.hibernate.hql.internal.antlr.HqlBaseParser.unaryExpression(HqlBaseParser.java:3401)
    at org.hibernate.hql.internal.antlr.HqlBaseParser.multiplyExpression(HqlBaseParser.java:3273)
    at org.hibernate.hql.internal.antlr.HqlBaseParser.additiveExpression(HqlBaseParser.java:2930)
    at org.hibernate.hql.internal.antlr.HqlBaseParser.concatenation(HqlBaseParser.java:615)
    at org.hibernate.hql.internal.antlr.HqlBaseParser.relationalExpression(HqlBaseParser.java:2697)
    at org.hibernate.hql.internal.antlr.HqlBaseParser.equalityExpression(HqlBaseParser.java:2558)
    at org.hibernate.hql.internal.antlr.HqlBaseParser.negatedExpression(HqlBaseParser.java:2522)
    at org.hibernate.hql.internal.antlr.HqlBaseParser.logicalAndExpression(HqlBaseParser.java:2438)
    at org.hibernate.hql.internal.antlr.HqlBaseParser.logicalOrExpression(HqlBaseParser.java:2403)
    at org.hibernate.hql.internal.antlr.HqlBaseParser.expression(HqlBaseParser.java:2116)
    at org.hibernate.hql.internal.antlr.HqlBaseParser.aliasedExpression(HqlBaseParser.java:2357)
    at org.hibernate.hql.internal.antlr.HqlBaseParser.selectedPropertiesList(HqlBaseParser.java:1390)
    at org.hibernate.hql.internal.antlr.HqlBaseParser.newExpression(HqlBaseParser.java:1434)
    at org.hibernate.hql.internal.antlr.HqlBaseParser.selectClause(HqlBaseParser.java:1306)
    at org.hibernate.hql.internal.antlr.HqlBaseParser.selectFrom(HqlBaseParser.java:1040)
    at org.hibernate.hql.internal.antlr.HqlBaseParser.queryRule(HqlBaseParser.java:748)
    at org.hibernate.hql.internal.antlr.HqlBaseParser.selectStatement(HqlBaseParser.java:319)
    at org.hibernate.hql.internal.antlr.HqlBaseParser.statement(HqlBaseParser.java:198)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:284)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:186)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:141)
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:115)
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:77)
    at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:153)
    at org.hibernate.internal.AbstractSharedSessionContract.getQueryPlan(AbstractSharedSessionContract.java:553)
    at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:662)
    at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:103)
    `

我无法找到使用 jpql 表达式将数据获取到复合类 dto 的任何相关答案。由于我是新人,我可能会遗漏一些东西。

任何善意的帮助将不胜感激。


AFAIK 像这样嵌套构造函数表达式是不可能的。据我所知,有一种方法可以做到这一点,但这是一种又脏又丑的方法。我将所有参数放入一个构造函数中,然后在构造函数中实例化其他类对象。

Example:

    public CommentDTO(Long id, String body, LocalDateTime datePosted,
                  LocalDateTime lastModifiedDate, Long userId,
                  String login, String avatarUrl, boolean hireable) {
    this.id = id;
    this.body = body;
    this.datePosted = datePosted;
    this.lastModifiedDate = lastModifiedDate;
    this.author = new UserDTO(userId, login, avatarUrl, hireable);

因此 JPQL 查询必须具有所有这些参数。

再次强调,不建议这样做,因为它变得 100% 不可维护。但这是我发现使用构造函数表达式执行此操作的唯一方法。

我只是重构为使用基于界面的投影。如果您使用 Spring Data JPA,则将其设置为嵌套投影非常容易。

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

使用构造函数表达式和 JPQL 的复合 DTO 投影 的相关文章

随机推荐

  • 如何在 Java Swing 应用程序中播放 MP4 视频

    有谁知道我可以在 JPanel 中播放 mp4 视频文件的方法吗 我尝试过使用 avi 文件使用 JMF 但没有成功 现在我对播放视频文件这样一个简单的任务变得如此乏味感到困惑和沮丧 请任何人告诉我我可以走什么路 我将不胜感激 我听说过 V
  • android recyclerview 不显示项目

    我想在我的回收视图中显示这些项目 但它根本不显示 而且我看不到错误 也许你们可以帮助我 MainActivity java RecyclerView recyclerView RecyclerView findViewById R id r
  • pandas 数据帧索引:to_list() 与 tolist()

    我最近为某人编写了一个 python 脚本 其中我使用以下命令将 pandas 数据帧的索引转换为列表to list 然而 这对他们不起作用 因为他们得到 AttributeError Index object has no attribu
  • 如何将 django 中的 InMemoryUploadedFile 转换为 flickr API 的格式?

    我有一个类将文件上传到 Flickr 该文件的类型为 内存中上传文件 我想知道如何将 InMemoryUploadedFile 文件中的数据转换或传递为 flickr API 的格式 Eg photo image jpg
  • Django 管理员:一对一关系作为内联?

    我正在为 satchmo 应用程序整理管理员 Satchmo 使用 OneToOne 关系来扩展基础Product模型 我想在一页上全部编辑 是否可以将 OneToOne 关系作为内联关系 如果没有 将一些字段添加到我的管理的给定页面 最终
  • Python - 快速修复:尝试登录时 getHeader() 属性错误

    我正在使用 Quickfix 并修改了 toAdmin 函数以将用户名和密码插入登录消息中 我根据 C 指令改编了代码 但遇到了奇怪的 getHeader 属性错误 回溯如下 lt 20151223 10 48 31 142 FIX 4 2
  • 为什么用 python 编写的决策树代码的预测结果与用 R 编写的代码不同?

    我正在 python 和 R 中使用 sklearn 的 load iris 数据集 在 R 中称为 iris 我使用 基尼 索引以两种语言构建了模型 并且当直接从虹膜数据集中获取测试数据时 我能够在两种语言中正确测试模型 但是 如果我给出
  • CoreData:无法在路径加载优化模型

    I am getting this warning multiple times when i goto a view using google maps This started as soon as i migrated to swif
  • 如何在 Vim 中向行范围添加行号?

    如何向在 Vim 中打开的文件中的一系列行添加行号 不像在 set nu 这只是displays行号 但实际上是否将它们添加到文件中的每一行前面 With s line 编辑 总结评论 该命令可以根据需要进行调整 假设您想在视觉选择的行前面
  • 如何在 fastapi 响应中包含非 pydantic 类?

    我想将自定义类包含到路线的响应中 我主要使用嵌套pydantic BaseModels 在我的应用程序中 因此最好返回整个内容 而无需编写从内部数据表示到路由返回内容的转换 只要一切继承自pydantic BaseModel这很简单 但我正
  • 我如何从网站上阅读? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在尝试制作一个机器人 如何从网站读取 1800 1800 这样的值 Console WriteLine Health Console
  • JWT 令牌存储在服务器的哪里以及其他相关问题

    正如标题所示 JWT 令牌存储在服务器端的哪里 在数据库中还是在内存中 我知道实施可能会因不同的要求而有所不同 但一般来说您会将其存储在哪里 如果我想提供一个非常基本的令牌身份验证服务器 这意味着在通过 POST 请求收到用户名和密码后 我
  • Docker - 检查容器内是否从主机安装了目录

    我需要检查目录是否在我正在运行的容器中是否从主机安装 示例 使用docker run v host data data 命令 如果未安装 我想警告用户 当容器终止时 此目录上的数据将丢失 我找到了一个粗略但简单的解决方案 mount gre
  • 在运行时石墨烯上创建动态模式

    我几乎花了 3 天找到一种在 python graphene 中创建动态模式的方法 我能找到的唯一相关结果是以下链接 https github com graphql python graphene blob master graphene
  • 我应该如何引用角度自定义元素(Web 组件)中的资源

    我创建了一个 Web 组件 并从其中引用了我的资产文件夹中的图像 as below img src assets bot png alt 在本地一切都很好 我将自定义元素发布到 firebase 主机 并且 javascript css 和
  • @media 查询中的字体大小不适用

    我已经设法让 iFrame 和正文内容宽度随着 media规则但是我无法成功调整字体大小 在我的 HTML 中 media规则位于我的样式 css 之后 位于单独的文件中 我看不出是什么在阻止font size改变字体大小 JSFiddle
  • Angular 2 如何用 PHP 发送邮件?

    我学习 Angular 2 但我在网上没有看到任何将简单的联系表单从 Angular 2 发送到 php scrip 的示例 我的 html 模板
  • 在哪里可以下载 MySQL Connector/J 的源代码

    谷歌搜索没有帮助 有趣的是 因为将 MySQL Connector J 复制粘贴到 Google 中 我得到了源代码作为第一个结果 但如果您正在寻找免费应用程序的源代码 我发现最方便的方法是在 Ubuntu 或 Debian 中查找相关包并
  • 伪元素上的伪类

    需要明确的是 我并不是想为 css 创建 伪 初始 只是想检查是否可以在伪元素上添加伪类 例如 some class after hover 似乎不起作用 这虽然有效 some class hover after 当然 这不是 some c
  • 使用构造函数表达式和 JPQL 的复合 DTO 投影

    我试图通过提供完全限定的名称从 db 选择特定列到复合类 DTO 中 Data public class Temp String dName Temp2 value public Temp String dName Temp2 value