尽管具有正确的 DTO,但无法使用请求的结果类型为具有多个返回的查询创建 TypedQuery

Posted

技术标签:

【中文标题】尽管具有正确的 DTO,但无法使用请求的结果类型为具有多个返回的查询创建 TypedQuery【英文标题】:Cannot create TypedQuery for query with more than one return using requested result type, despite having correct DTO 【发布时间】:2021-12-24 07:34:56 【问题描述】:

我已经完成了关于这个主题的其他类似问题,发现我的设置是正确的(至少证实了其他人过去的建议)。 我确实有一个专用的 AllRecordsDTO 用于此查询,它确实具有成功映射查询结果所需的所有字段。

AllRecordsDTO.java:

@NoArgsConstructor
@AllArgsConstructor
@ToString
public class AllRecordsDTO 

    @Getter
    @Setter
    private String recordName;

    @Getter
    @Setter
    private String recordTypeName;

    @Getter
    @Setter
    private String statusName;

    @Getter
    @Setter
    private String createdByUserId;

    @Getter
    @Setter
    private String createdDateTime;

    @Getter
    @Setter
    private String lastChangedByUserId;

    @Getter
    @Setter
    private String lastChangedDateTime;

   

allRecordsQuery 查询

    select r.recordName,
       rt.recordTypeName,
       s.name,
       usi.userId,
       r.createdDateTime,
       usi1.userId,
       r.lastChangedDateTime
from Record r
         left join Section s on s.id = r.statusId
         left join UniqueSecurityIdentifier usi on usi.id = r.createdByUserId
         left join RecordType rt on rt.id = r.recordTypeId
         left join UniqueSecurityIdentifier usi1 on usi1.id = r.lastChangedByUserId

抛出异常的那一行:

Query<AllRecordsDTO> createdQuery = statelessSession.createQuery(allRecordsQuery, AllRecordssDTO.class);

上面查询中使用的Entity字段都是String(即使是上面实体中的日期字段也是String)。

我不确定可能出了什么问题。

【问题讨论】:

【参考方案1】:

JPA 无法实现您的尝试。

您可以使用构造函数表达式。

select NEW <packagename>.AllRecordsDTO(r.recordName,
       rt.recordTypeName,
       s.name,
       usi.userId,
       r.createdDateTime,
       usi1.userId,
       r.lastChangedDateTime)
from Record r
         left join Section s on s.id = r.statusId
         left join UniqueSecurityIdentifier usi on usi.id = r.createdByUserId
         left join RecordType rt on rt.id = r.recordTypeId
         left join UniqueSecurityIdentifier usi1 on usi1.id = r.lastChangedByUserId

还请查看 Hibernate 文档:https://docs.jboss.org/hibernate/orm/current/userguide/html_single/Hibernate_User_Guide.html#hql-select-clause

【讨论】:

非常感谢。这行得通。但我没有提及更多细节(为简洁起见,认为这可能只是与查询语法相关的一个案例)。我的错。实际上我一直在尝试在 ScrollableResults 的上下文中使用它。我将编辑问题以添加更多上下文。 我将创建一个单独的帖子(关于 ScrollableResults 问题)引用此 OP。我相信我会公平对待回答者所投入的精力和时间。就最初的问题而言,它已经得到了回答。我将编辑这篇文章以删除编辑。谢谢。

以上是关于尽管具有正确的 DTO,但无法使用请求的结果类型为具有多个返回的查询创建 TypedQuery的主要内容,如果未能解决你的问题,请参考以下文章

JSON 解析错误:无法构造 `com.dto.IdDTO` 的实例(尽管至少存在一个 Creator)

NestJS 将 @Query() 反序列化为具有复杂类型的 DTO

为啥我从 Dapper 返回的对象具有 null 和默认属性值?

尽管配置了正确的 CORS 标头,但 301 响应“跨源请求被阻止”

尽管使用了 itemsBoundingRect(),但 QGraphicsScene 和 fitInView() 无法正确缩放

如何在 NestJs 框架中使用 postgres 和 sequelize 正确定义 DTO 对象