休眠搜索和条件构建器更新

问题描述 投票:0回答:2

我在休眠搜索中遇到问题,因为当我使用条件构建器1而不是在不使用其类的情况下按1来更新字段时,它不会在休眠搜索中更新其索引吗?您能启发我为什么会发生这种情况吗?谢谢。

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()
hibernate spring-boot hibernate-search
2个回答
0
投票
我使用此命令通过强制重新索引来解决我的问题。但是,如果您有任何好的建议或其他解决方案,我表示感谢。

enter image description here

Search.getFullTextEntityManager(entityManager).index(getProfile(uid))


0
投票
Hibernate Search的自动重新索引功能基于Hibernate ORM事件。当您使用实体的POJO表示形式和Session方法(session.persist,session.delete,...)直接创建/更新/删除实体时,这些事件由Hibernate ORM在内部触发。

当您使用条件更新/删除查询时,您的查询将转换为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

有两种解决方法:

    将实体加载到会话中以进行更改。仅当要更改的实体很少时才有意义。
  1. 正如您在自己的答案中所述,请在使用FullTextSession.index事实后触发实体的重新索引。
© www.soinside.com 2019 - 2024. All rights reserved.