簡體   English   中英

在本機查詢的運行時 (Hibernate/JPA) 臨時將 FetchType.LAZY 更改為 FetchType.EAGER

[英]Change FetchType.LAZY to FetchType.EAGER temporary at runtime (Hibernate/JPA) in native query

我有以下存儲庫方法

@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

如何動態更改 Section 實體的提取類型但使用本機 sql?

財產實體:

@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;

}

您需要創建一個 CustomDialect,它從您正在使用的方言的 class 擴展,並且在注冊器中,您不能通過以下方式使用 JPQL 的功能:

 public CustomDialect() {
    super();

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

你在哪里設置方言:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM