如何使用可能为null的参数的@Query

时间:2014-07-27 19:59:43

标签: spring-data-jpa

我有@Query给我带来麻烦。即使给定的父级为空,我也希望获得具有给定父级的所有网页。

可以设置父级,但也可以不设置父级。

我一直在尝试这个:

@Query("SELECT w FROM Webpage w WHERE w.parent = :parent OR (parent IS NULL AND :parent.id < '1')) ORDER BY w.listOrder")
public Page<Webpage> findByParent(@Param("parent") Webpage parent, Pageable page);

而且:

@Query("SELECT w FROM Webpage w WHERE w.parent = :parent OR (parent IS NULL AND :parent IS NULL)) ORDER BY w.listOrder")
public Page<Webpage> findByParent(@Param("parent") Webpage parent, Pageable page);

但我得到了例外:

Caused by: java.lang.IllegalArgumentException: Validation failed for query for method public abstract
com.thalasoft.learnintouch.data.jpa.domain.Webpage
com.thalasoft.learnintouch.data.jpa.repository.WebpageRepository.findByParentAndNameAndNotGarbage(com.thalasoft.learnintouch.data.jpa.domain.Webpage,java.lang.String)!

我使用的是弹簧3.2.9.RELEASE和spring-data-jpa 1.6.1.RELEASE版本。

关于如何在给定父级上进行选择的任何想法,即使给定的父级为空?

亲切的问候,

Stephane Eybert

1 个答案:

答案 0 :(得分:4)

如果提供程序上的验证不允许您传递空值,则可以将查询拆分为两个。您必须在呼叫者中设置逻辑以确定要呼叫哪一个。

Query1(param不为空):

@Query("SELECT w FROM Webpage w WHERE w.parent = :parent ORDER BY w.listOrder")
public Page<Webpage> findByParent(@Param("parent") Webpage parent, Pageable page);

Query2(param为null):

@Query("SELECT w FROM Webpage w WHERE w.parent is null ORDER BY w.listOrder")
public Page<Webpage> findByNullParent(Pageable page);

我建议您阅读提供商的更多文档,了解如何传递空值。