尽管具有正确的 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() 无法正确缩放