【问题标题】:How to Query against a List field and return a Page with Spring Data Hazelcast?如何查询列表字段并返回带有 Spring Data Hazelcast 的页面?
【发布时间】:2023-03-15 11:53:01
【问题描述】:

我有一个使用 spring-data-hazelcast 2.4.0 的 Spring Boot 项目。这是一个非常好的库,提供 HazelcastRepository,它抽象了标准 Spring Data Repository 范例背后的 hazelcast 交互。但是我在尝试对对象中的列表字段进行可分页查询时遇到了以下问题:

我有这个对象:

@Data
@KeySpace
public class Book implements Serializable {

    @Id
    private Long id;
    private String author;
    private List<String> categories;

}

我想使用 HazelcastRepository 对列表字段执行可分页查询。我可以使用下面的 org.springframework.data.hazelcast.repository.query.Query 注释在列表中查询,它工作正常:

@Query("categories[any] = %s")
Iterable<Book> findByCategory(String category);

但是当我尝试用这种方法返回一个页面时:

@Query("categories[any] = %s")
Page<Book> findByCategory(String category, Pageable pageable);

我得到以下异常: java.lang.ClassCastException: com.hazelcast.map.impl.query.QueryResultCollection 与 org.springframework.data.domain.Page 不兼容

作为替代方案,我尝试使用派生查询方法,例如:

Page<Book> findByCategories(String category, Pageable pageable);

但这会引发此异常: java.lang.IllegalArgumentException: 不能将 EqualPredicate 谓词与数组或集合属性一起使用

有没有办法在列表属性中结合搜索并使用 HazelcastRepository 返回页面结果?

【问题讨论】:

    标签: spring-boot spring-data hazelcast


    【解决方案1】:

    我认为你不能在 Hazelcast 中使用 @QueryPage&lt;&gt;。但是,您的第二个示例 (Page&lt;Book&gt; findByCategories(String category, Pageable pageable);) 应该可以正常工作。

    要使其正常工作,请检查测试中的示例:

    【讨论】:

    • 感谢@Rafał Leszko。这些测试中的域类 (github.com/hazelcast/spring-data-hazelcast/tree/master/src/test/…) 似乎没有列表属性。具有 Page 返回类型的派生查询适用于基于非集合字段的查询,例如 Book 的作者。我遇到的问题是当我查询一个集合字段时,比如图书类别。我收到一个异常说“不能将 EqualPredicate 谓词与数组或集合属性一起使用”
    猜你喜欢
    • 2015-11-13
    • 2019-05-13
    • 2019-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-14
    相关资源
    最近更新 更多