【发布时间】:2020-08-27 08:28:16
【问题描述】:
我在使用 JPA/Hibernate 时遇到了一个奇怪的问题,希望能得到一些帮助。 我的环境:
- OpenJDK 11.0.2 Spring Boot 2.2.2
- spring-boot-starter-JPA(以上Spring Boot版本的默认版本)
- 休眠 5.4.9
- 玛丽亚 DB 2.3.0
- Windows 10
我正在使用两个实体:
@Entity
@Table(name = "\"accUser\"")
public class User implements Serializable {
private static final long serialVersionUID = -5750077342980986498L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "UserID")
private Long id;
// NOTE: Below is an embedded object!
@OneToOne
@JoinColumn(name = "EmpNum")
private Employee employee;
//...other fields are wrapped primitives omitted for brevity
}
@Entity
@Table(name = "\"hrmEmployee\"")
public class Employee implements Serializable {
private static final long serialVersionUID = 5471137977607643256L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "EmpNum")
private Long employeeNumber;
@Column(name = "FirstName")
private String firstName;
//...other fields are wrapped primitives omitted for brevity
}
我定义了以下(关闭的)投影接口,每个接口都在自己的类文件中:
@Projection(types={ User.class })
interface UserProjection {
Long getId();
EmployeeFirstNameProjection getEmployee();
}
@Projection(types={ Employee.class })
interface EmployeeFirstNameProjection {
String getFirstName();
}
我正在调用这个Repository接口查询方法:
<T> T findUserById(Long id, Class <T> type);
并用这个Service方法调用上面的Repository方法:
public UserProjection getUser(Long id) {
return userRepository.findUserById(id, UserProjection.class);
}
所以在运行时,这里是单个返回的 UserProjection 的 JSON:
{"employee":{"firstName":"Matt"},"id":1796}
这正是我想要返回的。但是,当代码执行时,Hibernate 会在两个查询中选择两个实体中的所有字段,这是我不想要的。我使用 Projections 机制的全部原因是限制使用 JSON 的有线流量,并且出于性能原因还希望将查询数量保持在较低水平。
我期望看到一个 Hibernate 生成的查询。
为什么 Hibernate 会分别运行两个查询来选择每个实体中的每个字段?
提前致谢!
【问题讨论】:
-
注解Projection不需要了,可以试试去掉吗?
-
谢谢,Lucsbelt。我已经尝试过使用和不使用 Projection 注释并得到相同的结果。
-
(换句话说,@Projection 注释似乎不会以某种方式影响问题)。
-
当您单独查询 EmployeeFirstNameProjection 时也会发生这种情况?我在这里读到stackoverflow.com/a/53783270/3449039,当投影中有一个非原始字段时,所有列都包含在查询中。作为解决方法,您可以使用自定义 DTO 创建 JPQL 查询。
-
很遗憾我没有意识到这一点
标签: hibernate jpa projection