使用可选参数搜索

时间:2016-10-27 16:11:50

标签: spring-data-jpa spring-data-mongodb

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().and()使用它们并不是很好(参见上一段)。

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

1 个答案:

答案 0 :(得分:2)

最简单的选项是按示例查询http://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#query-by-example

何时使用

  • 使用一组静态或动态约束查询数据存储
  • 经常重构域对象而不用担心 打破现有的查询
  • 独立于底层作品 数据存储API

<强>限制

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

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