首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hibernate搜索6合并了不起作用的投影

Hibernate搜索6合并了不起作用的投影
EN

Stack Overflow用户
提问于 2022-04-08 18:43:49
回答 1查看 165关注 0票数 0

我已经实现了Hibernate搜索,目前在投影方面存在问题。所有相关数据都被编入索引,因此我尝试将它们投影到DTO。作为文档(单/#搜索-dsl-投影-合成),我尝试了以下内容

代码语言:javascript
复制
  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);

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

代码语言:javascript
复制
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有以下构造函数:

代码语言:javascript
复制
    public BuildingDto (){}
    public BuildingDto (String id, String name,String street, String zip, String town) {
       //setting vars
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-11 05:59:37

编辑:从Hibernate搜索6.2开始,您可以用@ProjectionConstructor注释您的DTO构造器

代码语言:javascript
复制
    @ProjectionConstructor
    public BuildingDto (String id, String name,String street, String zip, String town) {
       //setting vars
    }

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

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

代码语言:javascript
复制
  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);

更多信息,这里

原始答案(Hibernate搜索6.1及以下):

作为在参考文件中解释,类型安全的复合投影目前只能支持三个内部投影.

如果需要更多信息,创建DTO的“转换器”函数将需要接受List<?>并执行一些转换:

代码语言:javascript
复制
  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);

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71801844

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档