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

Dan*_*nik 6 java spring spring-data-jpa

我正在编写用于租用平面网络应用程序的后端,但我不知道如何从数据库中过滤公寓(例如可用房间、床位、楼层或城市)。所以我有 10 个字段,因此用户可以在一次搜索中选择所有字段来过滤平面,我只是想以一种方法将所有字段放入 JPA 存储库中,但是当我只使用其中的 5 个字段时,它开始冻结,我无法添加更多字段。当我开始输入例如 NumberOfRooms 时,它只是冻结,然后输入每个字母也冻结。

1.搜索(过滤)字段有限制吗?

2.还有什么方法可以做到这一点?(我想把所有东西都放在一个方法中,并在控制器中检查用户是否使用了所有过滤器,检查每个字段是否为空)

List<Flat> findAllByPriceBetweenAndCityAndRentORbuyAndUtilitiesBetweenAndNumberOfBedsBetweenAndNum(FastMoney less,FastMoney greater,String city,Boolean rentORbuy,int util1,int util2,int num1,int num2);
Run Code Online (Sandbox Code Playgroud)

Vla*_*cea 12

88个字符的查询方法?请不要!

当您可以编写格式良好的多行 JPQL 查询并Text Blocks用于加分时,为什么还要编写一个无法解析的 88 个字符的方法?

Spring Data Repositories 的自定义实现来拯救你!

如果要动态构建查询,请使用 Criteria API。您甚至可以从类型安全的Metamodel.

所以,这是你需要做的:

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

就是这样!


xp-*_*vit 8

在这里,由于您的用户并不总是提供您需要使用更多动态查询的所有字段。我推荐规范作为实现它的最佳方式。

您可以在官方文档中找到更多信息:https : //spring.io/blog/2011/04/26/advanced-spring-data-jpa-specifications-and-querydsl/