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");