所以基本上我正在编写一个使用 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/