在本机查询中,将FetchType.LAZY更改为运行时临时的FetchType.EAGER(Hibernate/JPA



我有以下存储库方法

@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 enity的获取类型?

房地产实体:

@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,它从您正在使用的方言的类扩展,并在注册器中以以下方式扩展您不能与JPQL一起使用的函数:

public CustomDialect() {
super();
registerFunction(
"func_custom",
new StandardSQLFunction(
"func_custom",
StandardBasicTypes.STRING
)
);
}

你在哪里设置方言:

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

最新更新