2015-05-13 33 views
17

我的理解是,对于Spring数据JPA,我不能有一个查询方法来获取列等于给定的非null方法参数的所有行,并使用相同的方法来获取所有行当方法参数为null时,此列为NULL的行。春天的数据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种不同的查询方法。

+0

呃,这是Spring Data JPA(恕我直言)的一个很大的限制。 –

回答

10

你说得对。

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

在你的情况,我会建议你编写你的存储库实现,并使用自定义CriteriaQuery来处理你的情况。

您也可以使用@Query注释与is null语法:

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

编辑

由于春季数据JPA 2.0,春天现在支持@Nullable注解。这对处理传递的空参数很有帮助。

documentation

@Nullable - 要在一个参数或返回值可以为空使用。

+2

我已经扩展了答案:当使用Spring数据JPA'@ Query'注释时,您必须使用两个单独的查询方法。一个用于处理空值,另一个用于非空值。但是当使用由Spring数据解析器解析的查询方法(不带'@ Query'注释)时,可以用一个方法处理null或非null值! –

+0

@Query':参数为null'不起作用。它失败时会出现异常,但即使不会,SQL也会将空值视为未知数。因此,未知与未知不相等......在SQL中,基本上'null'与'null'不相等。 – Stef

8

看起来Query by Example可能是你需要的。

查询通过实施例是在春季数据的一个新特性(since version Hopper,出于2016年4月),它允许一个像这样

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/findAll称取的org.springframework.data.domain.Example实例的代码创建简单的动态查询作为参数(并且其中一些还采取排序/分页参数)来自org.springframework.data.repository.query.QueryByExampleExecutor<T>接口,其由接口扩展了org.springframework.data.jpa.repository.JpaRepository<T, ID extends Serializable>接口。

总之,所有JpaRepository实例现在都有这些方法。