【问题标题】:Hibernate: returning a DTO that is not an Entity?Hibernate:返回不是实体的 DTO?
【发布时间】:2021-04-20 01:15:39
【问题描述】:

我有以下 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 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 返回这个 DTO 对象?

我知道这不是我的Contact 实体映射到Contact 数据库表的方式的实体,但我认为我仍然可以通过填充字段使用Hibernate 返回它。

【问题讨论】:

    标签: java mysql hibernate dto hibernate-native-query


    【解决方案1】:

    指定class 作为本机查询的结果仅适用于实体类。要指定 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");
    

    【讨论】:

      猜你喜欢
      • 2016-11-08
      • 1970-01-01
      • 2016-12-06
      • 2020-12-28
      • 2022-01-12
      • 1970-01-01
      • 2019-03-09
      • 2015-10-07
      • 1970-01-01
      相关资源
      最近更新 更多