首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Spring boot CrudRepository过滤数据

使用Spring boot CrudRepository过滤数据
EN

Stack Overflow用户
提问于 2015-11-11 16:29:48
回答 2查看 30K关注 0票数 18

我有一个简单的REST服务,可以用Spring boot CrudRepository访问数据。

这个存储库已经实现了如下分页和排序功能:

代码语言:javascript
运行
复制
public interface FlightRepository extends CrudRepository<Flight, Long> {
  List<Flight> findAll(Pageable pageable);
}

正在调用它:

代码语言:javascript
运行
复制
Sort sort = new Sort(direction, ordering);
PageRequest page = new PageRequest(xoffset, xbase, sort);

return flightRepo.findAll(page);

我还想在这个存储库中添加过滤功能(例如,只返回带有id > 13 AND id < 27的实体)。CrudRepository似乎不支持此功能。有没有什么方法可以做到这一点,或者我需要使用不同的方法?

谢谢你的建议!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-11 16:55:50

另一种方法是通过Criteria API或使用QueryDSL使用规范模式,这将解决您在上面的注释中对必须为每个参数组合创建查询方法的担忧。

下面概述了这两种方法,以回应对以下问题的关注:

对于更大的应用程序,查询方法的数量可能会增加,因为-这是第二点-查询定义了一组固定的标准。为了避免这两个缺点,如果您能想出一组可以动态组合来构建查询的原子谓词,那不是很酷吗?

https://spring.io/blog/2011/04/26/advanced-spring-data-jpa-specifications-and-querydsl/

我发现QueryDSL更容易使用。您只需要定义一个接口方法,然后您可以将参数的任意组合作为谓词传递给该方法。

例如:

代码语言:javascript
运行
复制
public interface UserRepository extends PagingAndSortingRepository<User, Long>, QueryDslPredicateExecutor<User> {
    public List<User> findAll(Predicate predicate);
}

和查询:

代码语言:javascript
运行
复制
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

票数 14
EN

Stack Overflow用户

发布于 2015-11-11 16:35:24

在您的存储库[EDITED]中声明以下函数

代码语言:javascript
运行
复制
Page<Flight> findByIdBetween(Long start, Long end, Pageable pageable)

然后,您可以从存储库的实例中调用此函数。有关更多信息,请参阅spring-data reference

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33646714

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档