gpt4 book ai didi

java - 在 spring 数据中使用什么代替 fetch.EAGER ?

转载 作者:行者123 更新时间:2023-12-02 11:12:35 25 4
gpt4 key购买 nike

我正在使用 spring-boot 和 angular5 ,我在 spring 中有这个实体:

@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Contrat implements Serializable{

@Id @GeneratedValue
private Long id;
private Date dateDebut ;
private Date dateFin ;
@ManyToOne
@JoinColumn(name = "Id_Project")
@JsonBackReference(value="projet-contrat")
private Project project;

@ManyToOne
@JoinColumn(name = "Id_AppUser")
@JsonBackReference(value="appuser-contrat")
private AppUser appUser;
}

存储库:

public interface ContratRepo extends JpaRepository<Contrat,Long> {

public Page<Contrat> findByAppUser(@Param("userApp") AppUser userApp, Pageable pageable);

}

由于 fetch.lazy 是默认的,当我尝试调用 findByAppUser 方法时,我得到的结果是:

{id: 1, dateDebut: 1526083200000, dateFin: 1526083200000} 

这是正常的,我想要的情况是还加载实体中存在的对象“项目”,但我不想使用 fetch.EAGER ,对于这个目标有什么解决方案吗?

最佳答案

您的实体是一对多关系对象。如果不使用EAGER,spring data将获取没有相关成员对象的对象。如果您通过 contract.getProject().getName() 获得该信息,则将发送另一个查询来获取该成员。

如果你记录 SQL,你可以看到,会有 2 个查询。但如果将该字段设置为 EAGER,则只会有 1 个查询。您可以获得明显的进步。

但是你不应该总是使用EAGER。如果在 90% 的时间里,您只需要 Contract 对象,而不需要它的项目数据。得到它是浪费时间。因为在SQL中,它会关联2个表并获取所有数据列。

所以,您应该根据您对该实体的使用情况做出此决定。

[根据评论更新]

您可以使用Query来编写您的sql表达式。例如,我有一个方法来获取实体的详细信息:

    @Query("select s from Contract s left join fetch s.project pr where s.id = ?1 ")
Contract findOneWithDetail(Long id);

如果我需要获取一条sql中的详细信息,我可以使用这种方法。如果我不需要项目详细信息,我只需使用 findOne(Long id),它提供了接口(interface)。

而且,如果您只想获取一些列,则需要使用构造函数定义一个 DTO,并编写如下方法:

    @Query("SELECT NEW com.mypackage.dto.ContractDTO(s.id, s.name, s.status)  FROM Contract AS s WHERE s.status = ?1")
List<ContractDTO> findDTOAllByStatus(String status);

关于java - 在 spring 数据中使用什么代替 fetch.EAGER ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50520210/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com