【问题标题】:Hibernate Search 6 combine projections not workingHibernate Search 6结合投影不起作用
【发布时间】:2022-07-18 20:15:32
【问题描述】:

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

  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
    }

【问题讨论】:

    标签: spring-boot hibernate jpa projection hibernate-search


    【解决方案1】:

    编辑:从 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);
    

    更多信息here


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

    作为explained in the reference documentation,类型安全的复合投影目前仅支持最多三个内部投影。

    如果您需要更多,创建 DTO 的“转换器”函数将需要接受 List&lt;?&gt; 并进行一些强制转换:

      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);
    

    是的,这很难看,但我们正在处理 better solutions

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-14
      • 2011-12-16
      • 1970-01-01
      • 2015-10-09
      • 2021-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多