在本机查询中将fetchtype.lazy更改为fetchtype.eager temporary at runtime(hibernate/jpa)

egdjgwm8  于 2021-07-29  发布在  Java
关注(0)|答案(1)|浏览(388)

我有以下方法

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

但当它试图获取节实体时,会得到lazyinitializationexception
如何使用本机sql动态更改节enity的获取类型?
财产实体:

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

部门实体:

  1. @Entity
  2. public class Section extends CreatedDateAuditedEntity {
  3. @ManyToOne(cascade = CascadeType.MERGE, fetch = FetchType.LAZY)
  4. @JoinColumn(name = "p_id", referencedColumnName = "p_id", updatable = false, nullable = false)
  5. private Property property;
  6. }
r6l8ljro

r6l8ljro1#

您需要创建一个customdialect,它从您正在使用的方言类扩展而来,并在注册器中以以下方式创建您不能与jpql一起使用的函数:

  1. public CustomDialect() {
  2. super();
  3. registerFunction(
  4. "func_custom",
  5. new StandardSQLFunction(
  6. "func_custom",
  7. StandardBasicTypes.STRING
  8. )
  9. );
  10. }

你把方言放在哪里:

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

相关问题