gpt4 book ai didi

java - 为什么这个 FetchType.LAZY 被忽略并且所有实体都在查询中获取?

转载 作者:行者123 更新时间:2023-11-30 05:26:39 26 4
gpt4 key购买 nike

我将 Spring Boot 2 与 Hibernate 一起使用,并且我有一个名为 ItemCarga 的实体:

@ManyToMany(cascade = { CascadeType.DETACH }, fetch = FetchType.LAZY)
@JoinTable(name = "rel_transp_carga", joinColumns = { @JoinColumn(name = "fk_item_carga") }, inverseJoinColumns = { @JoinColumn(name = "fk_transportadora") })
@LazyCollection(LazyCollectionOption.TRUE)
private Set<Transportadora> transportadoras = new HashSet<Transportadora>();

为什么使用我的存储库上的该实体进行查询,如下所示:

@Query("select e from ItemCarga e where e.cnpjCeramica = :cnpjCeramica and (e.dataInserido between :inicio and :fim) ")
List<ItemCarga> listarProdutosPorPeriodo(
@Param("cnpjCeramica") String cnpjCeramica,
@Param("inicio") Date dataInicial,
@Param("fim") Date dataFinal,
Sort sort);

结果是一组 ItemCarga 实体,其属性 transportadoras 与其所有项目一起获取。

它不应该为 null 或为空吗?

不应该被忽略,因为我没有在我的选择中提到该属性?

最佳答案

您确实在查询中提到了该属性:select e from ItemCarga e。这意味着您正在获取整个 ItemCarga 实体。由于您将 transportadoras 定义为 fetch = FetchType.LAZY,因此会创建一个代理(不会从数据库中获取数据)。

如果您使用事务调用查询,则可以迭代该集合,然后 hibernate 将获取子实体(这通常会导致 n+1 选择问题)。如果您尝试在事务之外访问它,将抛出LazyInitializationException

由于这只是 hibernate 的提示,因此您可以确保 Set 不会通过以下几种方式获取:

  1. 不查询它,例如:

    @Query("select e.field1, e.field2 from ItemCarga e ...")
    List<Object[]> listarProdutosPorPeriodo...

    缺点是你必须转换结果,

  2. 通过使用 dto 和查询映射。我就不详细描述了,更多你可以找here ,

  3. 通过使用投影 - 与您想要获取的字段的 getter 和 setter 接口(interface)。更多详情here .

关于java - 为什么这个 FetchType.LAZY 被忽略并且所有实体都在查询中获取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58438210/

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