【问题标题】:Change FetchType.LAZY to FetchType.EAGER temporary at runtime (Hibernate/JPA) in native query在本机查询中在运行时(Hibernate/JPA)临时将 FetchType.LAZY 更改为 FetchType.EAGER
【发布时间】:2020-11-19 00:08:44
【问题描述】:

我有以下存储库方法

@Query(value = "SELECT * FROM property p JOIN address a USING(a_id) JOIN address pa ON p.post_a_id = pa.a_id " +
        "JOIN section s ON s.p_id = p.p_id " +
        "WHERE p.organization_id = :orgId AND p.name ILIKE " +
        "ANY(SELECT UNNEST(ARRAY(SELECT CONCAT('%', UNNEST(STRING_TO_ARRAY(:search, ' ')), '%'))))",
        nativeQuery = true)
Page<Property> findPropertiesByOrganizationIdAndName(@Param("orgId") Long organizationId,
                                                     @Param("search") String search,
                                                     Pageable pageable);

但是当它尝试获取Section实体时会得到LazyInitializationException

如何使用原生 sql 动态更改 Section 实体的获取类型?

财产实体:

@Entity
@Table
public class Property extends CreatedDateAuditedEntity {
         @OneToMany(mappedBy = "property", cascade = CascadeType.REMOVE)
         @Fetch(value = FetchMode.SUBSELECT)
         private Set<Section> sections = new HashSet<>();
}

部分实体:

@Entity
public class Section extends CreatedDateAuditedEntity {

@ManyToOne(cascade = CascadeType.MERGE, fetch = FetchType.LAZY)
@JoinColumn(name = "p_id", referencedColumnName = "p_id", updatable = false, nullable = false)
private Property property;

}

【问题讨论】:

  • 你可以使用 EntityGraph
  • 但在那之后我无法将这种查询的和平转换为 jpql,因为 jpql 中不存在此类功能
  • ANY(SELECT UNNEST(ARRAY(SELECT CONCAT('%', UNNEST(STRING_TO_ARRAY(:search, '')), '%')))))
  • 啊,我看到你还对同一主题提出了另一个问题:-)
  • @Kayaman 我使用 OR-Mapping 已有 20 年了(TopLink、EclipseLink 和 Hibernate)。同样,如果我总是需要依赖项,为什么要声明它 LAZY,然后使用 EntityGraph 或 JoinFetch。没有意义。

标签: java sql hibernate jpa spring-data


【解决方案1】:

您需要创建一个 CustomDialect,它从您正在使用的方言的类和注册器中扩展您无法通过以下方式与 JPQL 一起使用的功能:

 public CustomDialect() {
    super();

    registerFunction(
        "func_custom",
        new StandardSQLFunction(
            "func_custom",
            StandardBasicTypes.STRING
        )
    );
}

你在哪里设置方言:

<property name="hibernate.dialect" value="your.package.CustomDialect"/>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-22
    • 1970-01-01
    相关资源
    最近更新 更多