为了账号安全,请及时绑定邮箱和手机立即绑定

Hibernate Search:从查询中获取参数化结果,没有未经检查的警告

Hibernate Search:从查询中获取参数化结果,没有未经检查的警告

小唯快跑啊 2021-12-22 19:16:15
是否可以从查询中获得参数化结果而没有在休眠搜索中未经检查的警告?在 Hibernate ORM (5.3.7.Final) 中,可以编写以下代码而没有任何未经检查的警告:List<Entity> result = session.createQuery("from Entity", Entity.class).list();但是在 Hibernate Search (5.10.4.Final) 中,我目前无法获得参数化结果,即使Entity.class在创建和执行查询期间指定了两次:QueryBuilder queryBuilder = fullTextSession                .getSearchFactory()                .buildQueryBuilder()                .forEntity(Entity.class)                .get();org.apache.lucene.search.Query luceneQuery = queryBuilder                .keyword()                .onField("field")                .matching("value")                .createQuery();Query query = fullTextSession.createFullTextQuery(luceneQuery, Entity.class);List result = query.list();当然,我可以写一些类似的东西:Query<Entity> query = fullTextSession.createFullTextQuery(luceneQuery, Entity.class);List<Entity> result = query.list();但这是一个未经检查的任务。或者我可以写List<Entity> parametrisedResult = (List<Entity>) result;但在这里我有一个未经检查的演员。由于 Hibernate ORM 有这种可能性,我假设在 Hibernate Search 中也可以编写没有未经检查的警告的代码。提前致谢。
查看完整描述

1 回答

?
PIPIONE

TA贡献1829条经验 获得超9个赞

不,目前无法实例化类型安全FullTextQuery(原因如下)。推荐的方法是这种方法,它适用于 Search 5.10 以及较旧的(5.7 之前的)版本:


QueryBuilder queryBuilder = fullTextSession

                .getSearchFactory()

                .buildQueryBuilder()

                .forEntity(Entity.class)

                .get();

org.apache.lucene.search.Query luceneQuery = queryBuilder

                .keyword()

                .onField("field")

                .matching("value")

                .createQuery();


FullTextQuery query = fullTextSession.createFullTextQuery(luceneQuery, Entity.class);

List<Entity> result = (List<Entity>) query.list();

为什么?

根据 ORM 标准,创建类型安全查询的能力是相当新的:它随 JPA 2.1 (ORM 5.2) 提供。在此之前,该list()方法用于List在 ORM 中返回原始(没有泛型类型参数),在 Hibernate Search 查询中也是如此。


Hibernate Search 并没有更改为遵循 ORM,但是:作为原始类型FullTextQuery扩展org.hibernate.query.Query,没有任何参数。原因是,FullTextQuery对象上有允许更改返回对象的修改器,从而更改返回的类型(特别是setProjection方法)。因此,即使我们可以FullTextQuery<Entity>在构建查询时返回 a ,这也会产生误导,因为在某些情况下,您最终可能会FullTextQuery<Entity>得到实际返回类型为 的结果的 a List<Object[]>。


我们探索了几个选项来解决这种情况,但找不到既能保证类型安全又能保持向后兼容性的解决方案。所以我们在 Hibernate Search 5 中放弃了这个。


如果您想知道,ORM 没有同样的问题,因为您在创建查询时指定了您希望查询返回的确切类型,并且之后无法更改它。


但是,在 Hibernate Search 的下一个专业版本 6 中,这将得到解决。新的查询构建 API 需要在您创建查询之前指定查询将返回托管实体还是索引投影。Hibernate Search 6 还不稳定,还没有准备好投入生产,但如果你很好奇,你可以在这里找到一个例子(asEntity调用告诉 Search 返回类型应该是什么)。


查看完整回答
反对 回复 2021-12-22
  • 1 回答
  • 0 关注
  • 227 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信