如何避免不需要的查询在将数据从实体导入DTO时休眠查询数据



我在下面有一些实体

@Entity
@Table("processitem")
public class Processitem {
...
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="task")
public Task task;
@ManyToOne
@JoinColumn(name="user")
public User user;
//... and some more relationship to other
}
@Entity
@Table(name="task") 
public class Task {
...
@OneToMany(mappedBy="task",cascade = CascadeType.ALL,orphanRemoval = true)
private Set<Processitem> processitem;
...
}

现在我导入了一个列表到列表(我使用一个循环将数据从实体导入到DTO(,(大约有200多条记录(hibernate执行了很多查询,性能不好。有什么解决方案可以避免这种情况吗?我尝试过使用实体图,但它仍然没有改进(有些时候2个查询更好,1个带有左联接的查询(

这是Blaze Persistence实体视图的完美用例。

我创建了这个库,以便在JPA模型和自定义接口或抽象类定义模型之间进行简单的映射,比如类固醇上的Spring Data Projections。其思想是,您可以按照自己喜欢的方式定义目标结构(域模型(,并通过JPQL表达式将属性(getter(映射到实体模型。

使用Blaze Persistence实体视图,用例的DTO模型可能如下所示:

@EntityView(Task.class)
interface TaskDto {
@IdMapping
Long getId();
String getName();
@Mapping(fetch = MULTISET)
Set<ProcessitemDto> getProcessitem();
}
@EntityView(Processitem.class)
public interface ProcessitemDto {
@IdMapping
Long getId();
@Mapping("user.name")
String getUserName();
}

查询是将实体视图应用于查询的问题,最简单的是按id进行查询。

TaskDto task = entityViewManager.find(entityManager, TaskDto.class, id);

Spring Data集成使您可以像使用Spring Data Projections一样使用它:https://persistence.blazebit.com/documentation/entity-view/manual/en_US/index.html#spring-数据特征

您可以使用Blaze Persistence实体视图提供的各种获取策略,但最好的策略通常是MULTISET获取策略。在这里,您可以阅读更多关于它的信息:https://persistence.blazebit.com/documentation/entity-view/manual/en_US/index.html#anchor-提取策略

最新更新