关于Hibernate Search 6.2嵌套谓词多层嵌套用法的技术咨询
Hibernate Search 6.2 多层嵌套谓词用法指南
问题背景
我们在SpringBoot项目中已使用Hibernate Search一段时间,现咨询多层嵌套场景下嵌套谓词的用法:
在6.1.5版本中,我们使用以下语法查询嵌套对象链:
List<Address> hits = searchSession .search(Address.class) .where(f -> f .nested().objectField("customer").nest( f .bool() .must( f .nested().objectField("customer.wishLists").nest( f.bool().must( f.nested().objectField("customer.wishLists.products").nest( f.match().field("customer.wishLists.products.title").matching("Nestle")) ) ) ) ) ) .fetchHits(page.getPageNumber() * page.getPageSize(), page.getPageSize());
随着6.2版本对嵌套谓词的改进,我们是否可以一步完成整个链的嵌套?还是仍需逐个对象进行嵌套?
解决方案
6.2版本支持一步完成多层嵌套
Hibernate Search 6.2对嵌套谓词做了简化优化,可以直接指定完整的嵌套路径一步完成嵌套,不需要再像旧版本那样逐层嵌套。你的第一个6.2版本示例思路正确,但需要调整语法细节(要将嵌套谓词添加到根查询中),正确写法如下:
List<Address> hits = searchSession .search(Address.class) .where((f, root) -> { root.add( f.nested("customer.wishLists.products") .add(f.match().field("customer.wishLists.products.title").matching("Nestle")) ); }) .fetchHits(page.getPageNumber() * page.getPageSize(), page.getPageSize());
无需逐层嵌套的原因
6.2版本的nested()方法支持直接传入完整的嵌套对象路径(如customer.wishLists.products),底层会自动解析路径上的所有嵌套对象层级,生成与逐层嵌套完全等价的查询逻辑,同时大幅简化代码结构。
关于逐层嵌套写法的说明
你提供的第二个6.2版本逐层嵌套写法虽然功能正常,但属于冗余写法,完全可以用一步嵌套替代,减少代码冗余和维护成本。
内容的提问来源于stack exchange,提问作者Aarya
相关产品推荐
相关产品推荐

