Hibernate Search 6组合投影不起作用



我已经实现了Hibernate Search,目前在Projection方面存在问题。所有相关数据都被编入索引,因此我尝试将它们投影到DTO。作为文件(https://docs.jboss.org/hibernate/stable/search/reference/en-US/html_single/#search-dsl投影复合(,我已经尝试了以下

searchSession.search(Building.class)
.select(f -> f.composite(BuildingDto::new,
f.field("id", String.class),
f.field("name", String.class),
f.field("street", String.class),
f.field("zip", String.class),
f.field("town", String.class)))
.where(f -> f.wildcard().fields("id", "name", "town", "street", "zip").matching(search))
.sort(f -> f.field("id").desc())
.fetch(20);

在运行构建时,我收到以下错误消息:

java: method composite in interface org.hibernate.search.engine.search.projection.dsl.SearchProjectionFactory<R,E> cannot be applied to given types;
required: org.hibernate.search.engine.search.projection.dsl.ProjectionFinalStep<?>[]
found: BuildingDto::new,org.hibernate.search.engine.search.projection.dsl.FieldProjectionValueStep<capture#1 of ?,java.lang.String>,org.hibernate.search.engine.search.projection.dsl.FieldProjectionValueStep<capture#2 of ?,java.lang.String>,org.hibernate.search.engine.search.projection.dsl.FieldProjectionValueStep<capture#3 of ?,java.lang.String>,org.hibernate.search.engine.search.projection.dsl.FieldProjectionValueStep<capture#4 of ?,java.lang.String>,org.hibernate.search.engine.search.projection.dsl.FieldProjectionValueStep<capture#5 of ?,java.lang.String>
reason: varargs mismatch; bad return type in method reference
BuildingDto cannot be converted to org.hibernate.search.engine.search.projection.SearchProjection<java.lang.Object>

BuildingDto具有以下构造函数:


public BuildingDto (){}
public BuildingDto (String id, String name,String street, String zip, String town) {
//setting vars
}

EDIT:从Hibernate Search 6.2开始,您可以用@ProjectionConstructor:注释DTO构造函数

@ProjectionConstructor
public BuildingDto (String id, String name,String street, String zip, String town) {
//setting vars
}

请确保使用-parameters编译器标志编译代码。

然后,你可以简单地这样做:

searchSession.search(Building.class)
.select(BuildingDto.class)
.where(f -> f.wildcard().fields("id", "name", "town", "street", "zip").matching(search))
.sort(f -> f.field("id").desc())
.fetch(20);

点击此处了解更多信息。


原始答案(休眠搜索6.1及以下版本(:

如参考文件中所述,类型安全的复合投影目前最多只能支持三个内部投影。

如果你需要更多;变压器";创建DTO的函数需要接受List<?>并执行一些强制转换:

searchSession.search(Building.class)
.select(f -> f.composite(list -> new BuildingDto(
(String) list.get(0),
(String) list.get(1),
(String) list.get(2),
(String) list.get(3),
(String) list.get(4)
),
f.field("id", String.class),
f.field("name", String.class),
f.field("street", String.class),
f.field("zip", String.class),
f.field("town", String.class)))
.where(f -> f.wildcard().fields("id", "name", "town", "street", "zip").matching(search))
.sort(f -> f.field("id").desc())
.fetch(20);

是的,这很难看,但我们正在研究更好的解决方案。

最新更新