2

我有以下ContactDTOjava POJO,它是我的实体的精简版本Contact,包含 100 多个字段/列

联系DTO:

public class ContactDTO {

    @JsonProperty
    private Integer contactId;

    @JsonProperty
    private String userName;

    @JsonProperty
    private String firstName;
    
    //getters and setters...
    
}

我试图在hibernate查询中返回它,如下所示,请注意,当我在MYSQLWorkbench 中手动运行此查询时,它会按预期工作:

@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通过填充字段来返回它。

4

1 回答 1

2

指定 aclass作为本机查询的结果仅适用于实体类。要指定 DTO(以及规范中的非托管类),您需要在 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");
于 2021-01-15T10:01:24.930 回答