如何使用 Spring JPA Repository 按多个字段过滤实体?

11
我正在为租赁公寓网站编写后端,但不知道如何从数据库中筛选公寓(例如:可用房间,床位,楼层或城市)。因此,我有10个字段,用户可以在一次搜索中选择所有这些字段来筛选公寓。我想要将所有的字段都放在一个JPA存储库方法中,但当我只使用其中5个时,它开始冻结了,我无法再添加更多的字段。例如,当我开始输入NumberOfRooms时,它就会冻结,然后每输入一个字母也会冻结。
1. 搜索(过滤)字段是否有限制?
2. 还有其他的方式吗?(我想把所有东西都放在一个方法里,在控制器中检查用户是否使用了所有的筛选器,检查每个字段是否为null)
List<Flat> findAllByPriceBetweenAndCityAndRentORbuyAndUtilitiesBetweenAndNumberOfBedsBetweenAndNum(FastMoney less,FastMoney greater,String city,Boolean rentORbuy,int util1,int util2,int num1,int num2);

2
派生查询仅可用于一个或两个字段。这样的长方法名称会降低代码可读性。对于多参数过滤器,您可以使用Specification作为存储库方法参数。我在此处回答了类似的问题https://dev59.com/aLbna4cB1Zd3GeqPfrhP#58243100 - Oleksii Valuiskyi
4个回答

17

不要用88字符查询方法!

你为什么要编写一个不可能解析的 88 字符方法,当你可以编写一个漂亮格式的多行 JPQL 查询,使用 Text Blocks 来加分呢?

Spring Data 存储库的自定义实现来拯救!

如果你想动态构建查询,使用 Criteria API。你甚至可以从类型安全的Metamodel中受益。

所以,这就是你需要做的:

  1. 转到 Spring Data 手册中的Spring Data 存储库的自定义实现部分,查看如何创建一个自定义存储库,其中你将添加 findFlats 方法。
  2. 在新的findFlats方法中,使用 Criteria API 动态构建查询。

就是这样!


10

2

-1

您也可以使用像这个库一样的工具,它让您构建动态过滤器(支持逻辑运算符、比较器、枚举、日期、布尔值、连接、函数等等):https://github.com/turkraft/spring-filter

查询示例:

/search?filter= average(ratings) > 4.5 and brand.name in ('audi', 'land rover') and (year > 2018 or km < 50000) and color : 'white' and accidents is empty

用法:

@GetMapping(value = "/search")
public List<Entity> search(@EntityFilter Specification<Entity> spec, Pageable page) {
  return repo.findAll(spec, page);
}

不要忘记依赖项:

<dependency>
    <groupId>com.turkraft</groupId>
    <artifactId>spring-filter</artifactId>
    <version>0.9.5</version>
</dependency>

你也可以查看rsql,尽管它现在有点过时 https://github.com/jirutka/rsql-parser


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接