1 回答
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 返回类型应该是什么)。
添加回答
举报