java通过多个可选参数筛选JPA存储库
我有一个简单的REST服务,它返回有大约20个字段的用户配置文件实体
我需要实现一个功能来过滤需要姓氏但所有其他字段(名字、年龄、城市、州、邮政编码等)都是可选的数据
有没有一种方法可以使用JpaRepository
而不为每个patamenter组合创建大量if
/else
语句
你可以在下面搜索框中键入要查询的问题!
我有一个简单的REST服务,它返回有大约20个字段的用户配置文件实体
我需要实现一个功能来过滤需要姓氏但所有其他字段(名字、年龄、城市、州、邮政编码等)都是可选的数据
有没有一种方法可以使用JpaRepository
而不为每个patamenter组合创建大量if
/else
语句
# 1 楼答案
JpaRepository接口还实现了QueryByExampleExecutor接口,该接口提供了使用示例查询(QBE)技术获取数据的findAll方法。该方法将真正适用于您的场景,并且在实体有很多字段并且您希望用户能够根据其中的一些字段筛选实体时,它实际上是理想的
假设实体是Person,您希望为获取属性等于指定属性的人员创建端点。这可以通过以下代码实现:
实体类:
控制器类:
服务类别:
存储库类:
# 2 楼答案
看看这个http://www.baeldung.com/entity-to-and-from-dto-for-a-java-spring-application
# 3 楼答案
它是JPA criteria的一个用例(从JPA2开始提供)
实际上,当您想要编写动态查询时,首先,您不希望为每个组合硬编码
JPQL
查询,也不希望连接JPQL
块,因为这很容易出错,并且在编译时不会检查请注意,在任何情况下(
Criteria
或JPQL
),如果客户机指定了每个可能的选项,则应该检查这些选项,以便能够在查询生成中考虑它们现在,在实现
JPARepository
接口时,有两种方法:使用
JpaSpecificationExecutor
接口提供的List<T> findAll(@Nullable Specification<T> spec);
,您也可以在自定义存储库中实现该接口使用您自己的接口丰富
JPARepository
,该接口定义了一个方法findAll()
,并将包含研究值的对象作为参数然后创建一个具体的类来实现
JPARepository
这样您就能够注入
EntityManager
并使用Criteria
API