当前位置: 首页 > 知识库问答 >
问题:

Spring Data-如果参数为空值,则忽略该参数

慕乐语
2023-03-14

我想要一个spring数据存储库接口,它采用两个参数。有没有办法使其具有以下行为?

MyObject findByParameterOneAndParameterTwo( String parameterOne, String parameterTwo);

如果这两个参数都有一个值,我希望它正常运行,并对这两个值执行“and”。

例如,如果第二个参数为null,则它将仅按ParameterOne进行搜索

有什么建议吗?

共有3个答案

殷耀
2023-03-14

目前,这在Spring data jpa中是不可能的。

有一个关于这个的JIRA票仍在由Spring团队进行调查。

但是,如果需要解决方法,可以签出一个简单的条件查询示例

詹甫
2023-03-14

这里缺少的一个解决方案是Spring Data JPA的示例查询功能,它利用了ExampleMatcher#ignoreNullValues,它的构建正是为了解决这个问题。不需要自定义查询和查询生成器。

此Spring数据查询:

ExampleMatcher matcher = ExampleMatcher.matching().withIgnoreNullValues();
Example<MyObject> exampleQuery = Example.of(new MyObject("foo", null), matcher);
List<MyObject> results = repository.findAll(exampleQuery);

生成一个如下所示的查询:

select * 
from myObject 
where parameter1 = "foo"

同时:

ExampleMatcher matcher = ExampleMatcher.matching().withIgnoreNullValues();
Example<MyObject> exampleQuery = Example.of(new MyObject("foo", "bar"), matcher);
List<MyObject> results = repository.findAll(exampleQuery);

产量:

select * 
from myObject 
where parameter1 = "foo"
and parameter2 = "bar"

很酷!

注意:您必须对存储库界面做的一件事是添加QueryByExample界面。您可以通过直接扩展QueryByExample接口,或者通过JpaRepository隐式扩展:

public interface MyObjectRepository extends JpaRepository<MyObject, Long> {}
段干浩荡
2023-03-14

我不确定是否可以使用存储库方法命名,但您可以使用@Query,如

(:parameterOne is null or parameter1 = :parameterOne) and (:parameterTwo is null or parameter2 = :parameterTwo)
 类似资料:
  • 问题内容: 我想要一个带有两个参数的spring数据存储库接口。有没有办法使其具有以下行为? 如果两个参数都有一个值,我希望它正常运行并对两个值都执行“与”运算。 例如,如果第二个参数为null,则它将仅按ParameterOne搜索 有什么建议么? 问题答案: 我不知道这是可能的仓库方法命名,但你可以使用像

  • 我目前正在开发我的项目的搜索和过滤功能。我正在尝试使用此请求主体检索数据: 下面是从ReasearchRepository检索此数据的方法: 我的问题是,当我试图从请求中的给定值中查找数据时,它返回一个空列表[],即使它存在于数据库中。我想要实现的是,如果参数为null,它将忽略查询中的特定条件,并且仍将返回数据。 我刚看完贝尔东的那篇文章。 我还找到了另一篇关于使用Criteria API的文章

  • 问题内容: 我有一个存储过程,可根据4个参数从表中获取信息。 我想基于参数获取值,但是如果参数为NULL,则不会检查该参数。因此,如果所有4个参数都为null,则将显示整个表。 这是我的SP(如您所见,这仅适用于1个参数atm): 有什么方法可以做到, 而 不必为每种可能的组合都加一个(15个IF)? 问题答案: 怎么样 在这种情况下,您可能还使用了 但总的来说,您可以尝试类似

  • 说我有下面的JPA方法: 用户通过输入字段和选择字段过滤这些对象的列表,从而调用此方法: 在这种情况下,如果用户不使用该字段进行搜索,则布尔值可以是true、false或null。看起来JPA实际上是在搜索一个空值,而我希望它忽略任何空值。我已经能够使用以下代码进行此组合搜索: 这是可行的,但显然,在一个有8个搜索选项的页面上,这将成为一场噩梦。字符串参数没有这个问题,因为当用户不选择过滤器时,它

  • Spring Hateoas没有为以下请求映射创建适当的链接: 致电/会员/12345时,您希望返回: 但相反,它返回: 这是为什么?即使我使用@Request estParam,它也完全忽略了过滤器。在这件事上,任何建议都将受到赞赏。

  • 如果没有声明相应的值,是否有可能动态忽略一些可选的参数?