spring-data-jpa – 使用可选参数进行搜索

spring-data-mongodb有一个非常好用且简单的查询构建器.我有多个搜索参数,我想搜索,可能会提供一些或不提供.这在spring-data-mongodb中非常简单地实现,并且它利用了Pageable和Page类:

    Query query = new Query().with(pageable);
    if (searchParameters.getPublished() != null) {
        query.addCriteria(Criteria.where("published").is(searchParameters.getPublished()));
    }
    List<Property> propertyList = mongoTemplate.find(query, Property.class);
    long count = mongoTemplate.count(query, Property.class);
    List<PropertySummary> propertySummaryList = propertyList.stream()
        .map(propertyConverter::convert)
        .collect(Collectors.toList());
    return new PageImpl<>(propertySummaryList, pageable, count);

spring-data-jpa中是否存在类似的内容?从花一天时间环顾四周,我会说不.有标准api,但没有与可分页和页面类集成,这是非常烦人的. spring-data-jpa似乎非常适合为您编写查询方法,您希望始终在单个字段上进行搜索.但是当你想要远远超过findCusomterByLastName(String lastName)做任何事情时,库很快就会崩溃.如果您指定了多个参数,那么它们实际上必须为搜索设置一些内容,如果其中一个为null,则它将匹配值为null的字段.

规范api似乎是一个好主意,但您必须能够在单个流畅的声明中定义查询.如果你想有条件地将规格添加到一起,api会很快崩溃.

QueryDslPredicateExecutor允许与面上的QueryDSL库集成似乎很有用.然而,它在很大程度上依赖于注释后处理器为您自动生成代码.这很棒,但只增加了创建类型安全查询的功能.然后,您可以将谓词传递给您的存储库,但这似乎很快就会崩溃.如何将谓词组合在一起?我找到的唯一方法是通过Specifications.where().和()使用它们,这不是很好(参见上一段).

有没有其他人分享这些挫折感?这似乎是一个简单的要求.我错过了spring-data-jpa中的某些内容吗?

最佳答案 最简单的选项是Query By Example:
http://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#query-by-example

何时使用

>使用一组静态或动态约束查询数据存储
>频繁重构域对象而不必担心
破坏现有查询
>独立于底层工作
数据存储API

限制

>不支持嵌套/分组属性约束,如firstname =?0或(firstname =?1和lastname =?2)
>仅支持字符串的开始/包含/结束/正则表达式匹配以及其他属性类型的精确匹配

再看看这个问题:Dynamic spring data jpa repository query with arbitrary AND clauses

点赞