Hibernate:返回不是实体的 DTO?
Hibernate: returning a DTO that is not an Entity?
我有以下 ContactDTO
java POJO,它是我的 Contact
实体的精简版,包含超过 100 个 fields/columns
联系人DTO:
public class ContactDTO {
@JsonProperty
private Integer contactId;
@JsonProperty
private String userName;
@JsonProperty
private String firstName;
//getters and setters...
}
我正尝试 return 在 hibernate
查询中执行此操作,请注意,当我 运行 在 MYSQL
中手动执行此查询时,此查询按预期工作 Workbench:
@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 return 这个 DTO 对象?
我知道这不是我的 Contact
实体映射到 Contact
数据库 table 的实体,但我认为我仍然可以 return 它通过填充字段使用 Hibernate
。
将 class
指定为本机查询的结果仅适用于实体 classes。要指定一个 DTO(以及规范中的非托管 class),您需要在 DTO 上指定一个构造函数并声明一个 SqlResultMapping
假设您在 ContactDTO
上声明了一个三参数构造函数,您应该添加:
@SqlResultSetMapping(name = "contactDTOResult",
classes = {
@ConstructorResult(targetClass = ContactDTO.class,
columns = {
@ColumnResult(name = "contactId"),
@ColumnResult(name = "userName"),
@ColumnResult(name = "firstName")})
})
并在您的本机查询中使用结果集映射名称 contactDTOResult
:
Query query = entityManager.createNativeQuery(queryString, "contactDTOResult");
我有以下 ContactDTO
java POJO,它是我的 Contact
实体的精简版,包含超过 100 个 fields/columns
联系人DTO:
public class ContactDTO {
@JsonProperty
private Integer contactId;
@JsonProperty
private String userName;
@JsonProperty
private String firstName;
//getters and setters...
}
我正尝试 return 在 hibernate
查询中执行此操作,请注意,当我 运行 在 MYSQL
中手动执行此查询时,此查询按预期工作 Workbench:
@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 return 这个 DTO 对象?
我知道这不是我的 Contact
实体映射到 Contact
数据库 table 的实体,但我认为我仍然可以 return 它通过填充字段使用 Hibernate
。
将 class
指定为本机查询的结果仅适用于实体 classes。要指定一个 DTO(以及规范中的非托管 class),您需要在 DTO 上指定一个构造函数并声明一个 SqlResultMapping
假设您在 ContactDTO
上声明了一个三参数构造函数,您应该添加:
@SqlResultSetMapping(name = "contactDTOResult",
classes = {
@ConstructorResult(targetClass = ContactDTO.class,
columns = {
@ColumnResult(name = "contactId"),
@ColumnResult(name = "userName"),
@ColumnResult(name = "firstName")})
})
并在您的本机查询中使用结果集映射名称 contactDTOResult
:
Query query = entityManager.createNativeQuery(queryString, "contactDTOResult");