【问题标题】:Cannot create TypedQuery for query with more than one return using requested result type, despite having correct DTO尽管具有正确的 DTO,但无法使用请求的结果类型为具有多个返回的查询创建 TypedQuery
【发布时间】: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)。

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

【问题讨论】:

    标签: java hibernate jpa spring-data-jpa jpql


    【解决方案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。我相信我会公平对待回答者所投入的精力和时间。就最初的问题而言,它已经得到了回答。我将编辑这篇文章以删除编辑。谢谢。
    猜你喜欢
    • 2016-02-13
    • 2021-06-09
    • 2016-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-11
    • 1970-01-01
    相关资源
    最近更新 更多