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

标签 java mysql hibernate dto hibernate-native-query

我有以下 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 通过填充字段。

最佳答案

指定作为 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/

相关文章:

MySQL:可选择构建 Group Concat 字段

java - 使用 Maven : Getting java. lang.ClassNotFoundException : org. springframework.web.bind.support.WebDataBinderFactory

java - hibernate pojo 过度暴露

java - 是否存在与 C union 或 C++ std::variant 等效的内存高效 Java?

java - 除 2 个十进制数,结果已知为 int

java - ImageView( Logo )未显示在第二个 Activity 中

java - 我如何将一个字符串数组从servlet发送到jsp并在jsp中接收它

java - 将 COUNT 与 DISTINCT 结合使用时出现 MySQLSyntaxErrorException

spring - Hibernate + Spring Autowiring 错误

MySQL group_concat 和 concat 姓氏、姓氏和头衔