我有一个简单的REST服务,可通过Spring boot访问数据CrudRepository。
CrudRepository
该存储库已经实现了分页和排序功能,如下所示:
public interface FlightRepository extends CrudRepository<Flight, Long> { List<Flight> findAll(Pageable pageable); }
调用它:
Sort sort = new Sort(direction, ordering); PageRequest page = new PageRequest(xoffset, xbase, sort); return flightRepo.findAll(page);
我还想向此存储库添加过滤(例如,仅返回带有的实体id > 13 AND id < 27)。CrudRepository似乎不支持此功能。有什么方法可以实现这一目标,还是我需要使用其他方法?
id > 13 AND id < 27
感谢您的提示!
一种替代方案,可以通过标准API或QueryDSL使用规范模式,可以解决您在上述注释中必须为每种参数组合创建查询方法的问题。
出于对以下方面的关注,下面概述了两种方法:
对于更大的应用程序,查询方法的数量可能会增加,这是因为-这是第二点- 查询定义了一组固定的条件。为避免这两个缺点,如果您能提出一组可以动态组合以构建查询的原子谓词,这不是很酷吗?
https://spring.io/blog/2011/04/26/advanced-spring-data-jpa-specifications- and-querydsl/
我发现QueryDSL易于使用。您只需要定义一个接口方法,然后就可以将参数的任意组合传递给谓词。
例如
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://www.querydsl.com/static/querydsl/2.1.0/reference/html/ch02s02.html
更新资料
从Spring Data模块的Gosling版本开始,现在支持从Web应用程序中的HTTP参数自动生成谓词。
https://spring.io/blog/2015/09/04/what-s-new-in-spring-data-release- gosling#querydsl-web-support