另一种方法是通过 Criteria API 或使用 QueryDSL 使用规范模式,它可以解决您在上面的评论中关于必须为每个参数组合创建查询方法的担忧。
下面概述了这两种方法,以回应以下问题:
对于较大的应用程序,查询方法的数量可能会增加,因为
of - 这是第二点 - 查询定义了一组固定的
标准。为了避免这两个缺点,如果你
可以提出一组可以组合的原子谓词
动态构建您的查询?
https://spring.io/blog/2011/04/26/advanced-spring-data-jpa-specifications-and-querydsl/ https://spring.io/blog/2011/04/26/advanced-spring-data-jpa-specifications-and-querydsl/
我发现 QueryDSL 更容易使用。您只需要定义一个接口方法,然后可以将任意参数组合作为谓词传递给该方法。
e.g.
public interface UserRepository extends PagingAndSortingRepository<User, Long>, QueryDslPredicateExecutor<User> {
public List<User> findAll(Predicate predicate);
}
并查询:
repository.findAll(QUser.user.address.town.eq("Glasgow").and(QUser.user.gender.eq(Gender.M)));
repository.findAll(QUser.user.address.town.eq("Edinburgh"));
repository.findAll(QUser.user.foreName.eq("Jim"));
其中 QUser 是 QueryDSL 自动生成的类。
http://docs.spring.io/spring-data/jpa/docs/current/api/index.html?org/springframework/data/jpa/repository/support/QueryDslRepositorySupport.html http://docs.spring.io/spring-data/jpa/docs/current/api/index.html?org/springframework/data/jpa/repository/support/QueryDslRepositorySupport.html
http://www.querydsl.com/static/querydsl/2.1.0/reference/html/ch02s02.html http://www.querydsl.com/static/querydsl/2.1.0/reference/html/ch02s02.html
Update
从 Spring Data 模块的 Gosling 版本开始,现在支持从 Web 应用程序中的 HTTP 参数自动生成谓词。
https://spring.io/blog/2015/09/04/what-s-new-in-spring-data-release-gosling#querydsl-web-support https://spring.io/blog/2015/09/04/what-s-new-in-spring-data-release-gosling#querydsl-web-support