弹簧数据 JPA 和可以为空的参数

2022-09-01 01:01:45

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

这是对的吗?

因此,我必须在我的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种不同的查询方法。


答案 1

你是对的。

已提出一个请求以支持更好地处理 null 参数。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 的参数或返回值。


答案 2

似乎“按示例查询”可能是您需要的。

Query by Example是Spring Data中的一项新功能(自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);

将 实例作为参数的方法(其中一些还采用排序/分页参数)来自接口,它由接口扩展。count/findOne/findAllorg.springframework.data.domain.Exampleorg.springframework.data.repository.query.QueryByExampleExecutor<T>org.springframework.data.jpa.repository.JpaRepository<T, ID extends Serializable>

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