【问题标题】:jpa entitymanager - map query result into nested dto classesjpa entitymanager - 将查询结果映射到嵌套的 dto 类
【发布时间】:2022-01-11 11:34:42
【问题描述】:

我在我的 java spring 应用程序中使用 jpa EntityManager with hibernate。假设我有一个如下的用户实体:

public class User {
    private Long id;
    ...
    
    @ManyToOne
    private Address address
}

我有自定义用户 dto 对象用于传递给客户端:

public class UserDTO {
    private Long id;
    private AddressDTO address;
    ...
}

我有一个 UserRepository 可以使用 EntityManagerQuery 执行正常的 jpql 查询。

注意,我需要自定义 dto,因为我的 dto 有一些实体中不存在的字段,必须在查询中计算。现在我的问题是:EntityManager 有什么方法可以将平面查询结果映射到我的嵌套 UserDTO 中? 事实上,我需要将 AdressDTO 中的地址结果映射到 UserDto 中等等。

注意:我想使用 jpql 而不是原生 sql 查询。

【问题讨论】:

标签: java hibernate jpa entitymanager


【解决方案1】:

你是在正确的方式。

您确实需要获取 User,然后将其转换为 UserDTO。 不要在查询中构建 DTO。

对于该转换,您需要 Java Mapper。我更喜欢MapStruct,但是有很多这样的工具(ModelMapper、Dozer 等)。

MapStruct 也很聪明,可以管理嵌套对象。

【讨论】:

  • 那么,存储库方法的响应类型应该是哪个模型呢?我最初的问题是如何将查询结果映射到 dto?如果我想使用 mapstruct 或任何其他映射器进行映射,映射器输入数据的格式应该是什么?
  • 映射器输入数据可能是您的实体(用户)的吸气剂
【解决方案2】:

您可以直接在 JPQL 中构建 DTO。 这是一个例子。

select new your.package.UserDTO(u.id, a.country, a.city, a.street)
from User u join u.address a
where ...

这样的查询返回List<UserDTO>

当然UserDTO 必须有合适的构造函数:

public UserDTO(Long id, String country, String city, String street){
   this.id = id;
   this.address = new AddressDTO(country, city, street);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-13
    • 1970-01-01
    • 2019-07-25
    • 2019-07-15
    • 1970-01-01
    • 1970-01-01
    • 2021-02-21
    • 2020-12-08
    相关资源
    最近更新 更多