gpt4 book ai didi

java - Hibernate:返回一个不是实体的 DTO?

转载 作者:行者123 更新时间:2023-12-04 08:15:24 30 4
gpt4 key购买 nike

我有以下 ContactDTO java POJO 是我的 Contact 的精简版包含超过 100 个字段/列的实体
联系DTO:

public class ContactDTO {

@JsonProperty
private Integer contactId;

@JsonProperty
private String userName;

@JsonProperty
private String firstName;

//getters and setters...

}
我试图在 hibernate 中返回这个查询如下,请注意,当我在 MYSQL 中手动运行时,此查询按预期工作工作台:
@Override
public ContactDTO getContactDTObyId(String client, Integer id) throws ATSException {

EntityManager entityManager = null;
try {

entityManager = entityManagement.createEntityManager(client);

String queryString = "select contact_id as contactId, username as userName, first_name as firstName from " + client + ".contact where "+" contact_id = " + id + "";

Query query = entityManager.createNativeQuery(queryString, ContactDTO.class);

return (ContactDTO) query.getSingleResult();

} catch (Exception e) {
log.error("An error is thrown in getContactDTObyId");
} finally {
entityManagement.closeEntityManager(client, entityManager);
}
}
以上在 getSingleResult() 处给了我以下错误线:
org.hibernate.MappingException: Unknown entity: ContactDTO
如何使用 Hibernate 返回此 DTO 对象?
我知道这不是我的 Contact 中的实体。实体映射到 Contact数据库表,但我认为我仍然可以使用 Hibernate 返回它通过填充字段。

最佳答案

指定 class由于 native 查询的结果仅适用于实体类。要指定 DTO(以及规范中的非托管类),您需要在 DTO 上指定一个构造函数并声明一个 SqlResultMapping假设您在 ContactDTO 上声明了一个三参数构造函数你应该添加:

@SqlResultSetMapping(name = "contactDTOResult",
classes = {
@ConstructorResult(targetClass = ContactDTO.class,
columns = {
@ColumnResult(name = "contactId"),
@ColumnResult(name = "userName"),
@ColumnResult(name = "firstName")})
})
并在您的 native 查询中使用结果集映射名称 contactDTOResult :
Query query = entityManager.createNativeQuery(queryString, "contactDTOResult");

关于java - Hibernate:返回一个不是实体的 DTO?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65728810/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com