【发布时间】:2020-09-23 16:11:40
【问题描述】:
当我尝试将实体映射到响应时,我遇到了严重的性能问题。
这是实体:
@Entity
@Table(name = "MyEntity")
public class MyEntity extends BaseEntity {
@Column(name = "someOtherId", nullable = false)
private String someOtherId;
@ElementCollection
@CollectionTable(name = "Phones", joinColumns = @JoinColumn(name = "myEntityId"))
@Column(name = "phone")
private List<String> phones; // <------- we care about this
@ElementCollection
@CollectionTable(name = "Websites", joinColumns = @JoinColumn(name = "myEntityId"))
@Column(name = "websites")
private List<String> websites; // <------- we care about this
@Fetch(FetchMode.SUBSELECT)
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "myEntity")
private List<ContactEntity> bbb;
@Fetch(FetchMode.SUBSELECT)
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "myEntity")
private List<AddressEntity> ccc;
}
这就是我使用 DAL 获取它的方式:
List<MyEntity> findByTenantIdAndIdIn(String someOtherId, Set<String> MyEntityIds);
现在,当我遍历 List<MyEntity> 来映射它并调用 myEntity.getPhones() 时,我看到正在进行数据库调用,这就是导致速度下降的原因,1000 个实体的速度下降了 70 秒。
那么当我调用findByTenantIdAndIdIn 时,我可以做些什么来强制它在第一个查询中使用join?
注意事项:
-
Phones是一个包含列的简单表:[myEntityId, phone] -
Websites也会出现同样的问题
【问题讨论】:
标签: java spring-boot hibernate jpa