java - 返回 DTO 内的另一个实体或 DTO

标签 java hibernate hql dto

所以基本上我正在编写一个使用 DTO 的 API,但我在返回 DTO 内的另一个实体时遇到了问题。

这是我的 DTO:

public class DirectoryDTO {

  String personFirstName;
  String personLastName;
  Hrper hrper;

  public DirectoryDTO(String personFirstName, String personLastName, Hrper hrper) {
    this.personFirstName = personFirstName;
    this.personLastName = personLastName;
    this.hrper = hrper;
   }
  // getters and setters
}

我的使用查询的服务:

public List<DirectoryDTO> getCustomDirectoryEntries(String department) {

  List<DirectoryDTO> directoryDTOS = em.createQuery(
        "select new dto.DirectoryDTO(" +
                "p.firstName, " +
                "p.lastName, " +
                "p.hrper " +
                ")  " +
                "  from Person p " 
                , DirectoryDTO.class)
        .getResultList();

  return directoryDTOS;
}

所以基本上这会返回一个 DirectoryDTO 列表,其中填写了除了连接到 Person 的 Hrper 实体之外的所有信息:

返回数据:

{
    "personFirstName": "John",
    "personLastName": "Doe",
    "hrper": null
}, ....

还有一些其他的事情...

1) 当我取出查询中的 DTO 部分并将结果写入列表时,我在 Hrper 中获取数据,这意味着我的连接不正确。

2) 我还尝试用 DirectoryDTO 中创建的 HrperDTO HrperDto 替换 Hrper Hrper,但是我的查询将无法运行,因为它正在查找 DTO 而不仅仅是实体

最佳答案

好吧,您不提供实体,所以我无法测试它,但这是一个快速尝试的事情,所以希望如果它不起作用,我不会浪费您太多的时间。尝试使用 JOIN FETCH 语法显式告诉 JPA 立即加载相关实体。尝试将 from Person p 替换为 from Person p join fetch p.hrpr h

由于 SELECT NEW IIRC 不会检索对象的完整图表,除非您告诉它,您甚至可能不需要 fetch 关键字 - 这可能有效:from Person p join p.hrpr h

关于java - 返回 DTO 内的另一个实体或 DTO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49575250/

相关文章:

java:如何使用 apache poi 创建数据透视表?

java - 如何停止主线程并等待打开的弹出表单在JAVA中处理?

hibernate - Spring /hibernate 异常 : createCriteria is not valid without active transaction

hibernate - 仅比较 HQL 中的日期组件

Java NamedQuery 并将日期设置为参数

java - 使用 Android 的基于标记的增强现实模型查看器

java - 如何实现 sleep 以显示图像幻灯片

java - 更新我的 HashSet 中的一些元素

java - 不支持使用 JPA 更新查询的 DML 操作

java - hibernate (HQL)