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

标签 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 但它没有与 pageable 和 page 类集成,这很烦人。 spring-data-jpa 似乎很擅长为您编写查询方法,以便您始终在单个字段上进行搜索。但是当你不想做任何比 findCusomterByLastName(String lastName) 更难的事情时,库很快就会崩溃。 .如果您指定多个参数,那么它们实际上都必须为搜索设置一些内容,如果其中一个为空,则它将匹配值为空的字段。

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

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

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

最佳答案

最简单的选项是 示例查询 :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

    关于spring-data-jpa - 使用可选参数搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40289540/

    相关文章:

    java - @OneToOne 单向映射中的实体映射中的重复列

    java - 与延迟加载一对一关系的 n+1 问题

    java - Spring Boot JPA依赖异常

    java - 抽象类中的Spring数据@Transient

    java - 是否可以使用 spring-data-mongodb 1.10 创建 Mongo View ?

    java - 如何在 Spring Data JPA 中获取最后一页作为默认值

    java - Spring Boot 数据未从事件监听器中保存

    MongoDB $group操作-内存使用优化

    spring-data-mongodb - Spring Data Mongodb 批量操作示例

    java - 使用 Spring Data Mongo 从 MongoDB 获取数组元素