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

Spring数据JPA和可以为空的参数

仉磊
2023-03-14

我的理解是,对于Spring数据JPA,我不能用一个查询方法来获取列等于给定的非空方法参数的所有行,也不能用相同的方法来获取方法参数为空时该列为空的所有行。

那是正确的吗?

所以我必须在我的JAVA代码中区分这一点,我必须使用一个单独的查询方法显式地请求空值,就像下面的例子一样?

// Query methods
List<Something> findByParameter(Parameter parameter);
List<Something> findByParameterIsNull();

...

List<Something> result = new ArrayList<>();

if (parameter == null)
  result = findByParameterIsNull();
else
  result = findByParameter(parameter);

这很糟糕,如果我有4个可能为空的参数,并且必须编码16种不同的查询方法。

共有3个答案

丁鸿云
2023-03-14

我发现了一些。。。如果你像这样把参数放在jpa方法中

@Param("value") String value,

然后它可以为null,在查询中,您将遇到以下条件:

(table.value = :value OR :value IS NULL)

如果值为null,它将自动返回true,如果不是null,它将在表中搜索该值。

欧阳德运
2023-03-14

你需要的似乎是通过示例进行查询。

示例查询是Spring数据中的一个新功能(自2016年4月发布的Hopper版本以来),它允许用户使用如下代码创建简单的动态查询

Person person = new Person();                          
person.setFirstname("Dave");                           

ExampleMatcher matcher = ExampleMatcher.matching()     
  .withIncludeNullValues();                        

Example<Person> example = Example.of(person, matcher);

personRepository.count(example);
personRepository.findOne(example);
personRepository.findAll(example);

org.springframework.data.domain.示例的实例作为参数(其中一些还将排序/分页参数)的方法来自org.springframework.data.repository.query.

简而言之,现在所有的JpaRepository实例都有这些方法。

毕泽宇
2023-03-14

你是对的。

已请求支持更好地处理空参数。https://jira.spring.io/browse/DATAJPA-121

在您的案例中,我建议您编写存储库实现,并使用自定义的CriteriaQuery来处理您的案例。

您还可以将@Query注释与is null语法一起使用:

@Query("[...] where :parameter is null"
public List<Something> getSomethingWithNullParameter();

编辑

自从Spring数据jpa 2.0以来,Spring现在支持@Nullable注释。这有助于处理传递的空参数

从留档:

@nullable-用于可以为null的参数或返回值。

 类似资料:
  • 问题内容: 我的理解是,对于Spring数据JPA,我无法使用查询方法来获取列等于给定非空方法参数的所有行,而当方法参数为null时,无法使用相同的方法来获取此列为NULL的所有行。 。 那是对的吗? 因此,我必须在我的JAVA代码中对此进行区分,并且必须使用单独的查询方法明确要求空值,如下面的示例所示? 不好的是,如果我有4个可以为null的参数,并且必须编写16种不同的查询方法。 问题答案:

  • 我读过一些关于在存储库请求中使用空值的帖子,但它们都已经存在多年了。所以我问这个问题是为了了解问题的现状。 我想说的是: 我想要一个带有可选空值的JPA请求。我的存储库中的函数如下所示: 这样我就可以像这样省略过滤器中的参数:(@Query的一部分) 这只在我的参数不为NULL时有效。 请注意,我在这里使用的是原生查询。(JPA实现是Hibernate,DB是postgres) 提前感谢您的每一次

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

  • 我有一个Spring Boot应用程序,使用Spring Data JPA查询MySQL数据库。 我需要得到一份经过一些参数筛选的课程列表。 我通常使用语法

  • 上述URL中的title可以默认为空吗,例如可传可不传!

  • 问题内容: 我正在使用Spring Data JPA,当我用来定义一个 WITHOUT 的查询时,它可以工作: 但是,如果我添加第二个参数,则将无法正常工作,Spring将解析该方法的名称,然后抛出 异常 。这是错误吗? 问题答案: 在Spring论坛上提出了一个类似的问题,指出要应用分页,必须派生第二个子查询。因为子查询引用的是相同的字段,所以您需要确保查询对引用的实体/表使用别名。这意味着您在