【发布时间】:2019-04-18 16:13:05
【问题描述】:
我有一个实体,它具有简单的字符串列以及许多 ElementCollections(列表和地图)。我注意到查看我的 postgres 日志, PostGres 在查询此实体时连续执行一堆 SELECT 查询以获取所有 ElementCollections。
为了提高效率,我想用一些内部 JOIN 执行一个 SELECT 查询可能会更好地避免所有单独的 SELECT 查询。有没有办法在不使用所有 INNER JOIN 手动编写非常冗长的选择查询的情况下做到这一点?
我一直在寻找 FetchTypes 和 Spring QueryData 语言以及 DTO 投影,但我想可能会有更直接的方法。我一直认为理所当然的好处是,如果我添加一个新字段,那么我将不得不继续更新我的查询,如果 Spring 正在为我生成查询,那么我就不必做任何事情。
// Person.java
@Entity
public Person {
@Id
long personId;
@Column
String firstName;
@Column
String lastName;
@ElementCollections
Set<String> someField;
@ElementCollections
Map<String, String> otherField;
@ElementCollections
Set<String> anotherField;
@ElementCollections
Map<String, String> yetAnotherField;
}
现在发生的事情是
SELECT firstName, lastName FROM Person WHERE personId=$1
SELECT someField FROM Person_SomeField WHERE someField.personId=$1
SELECT otherField.key otherField.value FROM Person_OtherField WHERE otherField.personId=$1
所有 ElementCollections 表都会继续这种情况,这会导致大量查询。
【问题讨论】:
标签: spring hibernate spring-boot jpa spring-data-jpa