Hibernate Search 和 Criteria Builder 更新
Hibernate Search and Criteria Builder Update
我在休眠搜索中遇到问题,因为当我使用条件生成器 1 对 1 更新字段而不使用其 class 它不会在休眠搜索中更新其索引,你能告诉我为什么会这样吗发生 ?谢谢。
val builder: CriteriaBuilder = entityManager.criteriaBuilder
val criteria: CriteriaUpdate<Profile> = builder.createCriteriaUpdate(Profile::class.java)
val root: Root<Profile> = criteria.from(Profile::class.java)
fname?.let { criteria.set(root.get("firstName"), it) }
lname?.let { criteria.set(root.get("lastName"), it) }
birthdate?.let { criteria.set(root.get("birthDate"), it) }
mname?.let { criteria.set(root.get("middleName"), it) }
criteria.set(root.get("updatedBy"), uid)
.where(builder.equal(root.get<String>("user").get<String>("id"), uid))
entityManager.createQuery(criteria).executeUpdate()
我使用此命令使用强制重新(索引)解决了我的问题。但如果您有任何好的建议或其他解决方案,我很乐意感谢。
Search.getFullTextEntityManager(entityManager).index(getProfile(uid))
Hibernate Search 的自动重建索引功能基于 Hibernate ORM 事件。这些事件由 Hibernate ORM 在内部触发,当您直接 create/update/delete 实体时,使用其 POJO 表示和会话方法(session.persist、session.delete、...)。
当您使用条件 update/delete 查询时,您的查询将被转换为 SQL 并直接发送到数据库。这意味着 Hibernate ORM 将不知道哪些实体已被准确更改,因此它不会发送与这些更改相关的内部事件。所以 Hibernate Search 根本不会意识到这些变化,也无法重新索引实体。
Hibernate Search 6(目前处于 Beta 阶段)的文档中对此限制进行了解释:https://docs.jboss.org/hibernate/search/6.0/reference/en-US/html_single/#mapper-orm-indexing-automatic-concepts
有两种解决方法:
- 将实体加载到会话中以更改它们。仅当要更改的实体很少时才有意义。
- 正如您在自己的回答中提到的,使用
FullTextSession.index
. 在事后触发实体的重新索引
我在休眠搜索中遇到问题,因为当我使用条件生成器 1 对 1 更新字段而不使用其 class 它不会在休眠搜索中更新其索引,你能告诉我为什么会这样吗发生 ?谢谢。
val builder: CriteriaBuilder = entityManager.criteriaBuilder
val criteria: CriteriaUpdate<Profile> = builder.createCriteriaUpdate(Profile::class.java)
val root: Root<Profile> = criteria.from(Profile::class.java)
fname?.let { criteria.set(root.get("firstName"), it) }
lname?.let { criteria.set(root.get("lastName"), it) }
birthdate?.let { criteria.set(root.get("birthDate"), it) }
mname?.let { criteria.set(root.get("middleName"), it) }
criteria.set(root.get("updatedBy"), uid)
.where(builder.equal(root.get<String>("user").get<String>("id"), uid))
entityManager.createQuery(criteria).executeUpdate()
我使用此命令使用强制重新(索引)解决了我的问题。但如果您有任何好的建议或其他解决方案,我很乐意感谢。
Search.getFullTextEntityManager(entityManager).index(getProfile(uid))
Hibernate Search 的自动重建索引功能基于 Hibernate ORM 事件。这些事件由 Hibernate ORM 在内部触发,当您直接 create/update/delete 实体时,使用其 POJO 表示和会话方法(session.persist、session.delete、...)。
当您使用条件 update/delete 查询时,您的查询将被转换为 SQL 并直接发送到数据库。这意味着 Hibernate ORM 将不知道哪些实体已被准确更改,因此它不会发送与这些更改相关的内部事件。所以 Hibernate Search 根本不会意识到这些变化,也无法重新索引实体。
Hibernate Search 6(目前处于 Beta 阶段)的文档中对此限制进行了解释:https://docs.jboss.org/hibernate/search/6.0/reference/en-US/html_single/#mapper-orm-indexing-automatic-concepts
有两种解决方法:
- 将实体加载到会话中以更改它们。仅当要更改的实体很少时才有意义。
- 正如您在自己的回答中提到的,使用
FullTextSession.index
. 在事后触发实体的重新索引