我有一个使用Spring Data JPA查询MySQL数据库的Spring Boot应用程序。
我需要获取一组带有某些参数的课程列表。
通常,我会使用以下语法param IS NULL or (/*对param进行操作*/)
来忽略参数如果它是空值的情况。
对于简单数据类型,我没有问题,但当涉及到对象列表时,我不知道如何检查NULL
值。在下面的查询中,我该如何检查?3
参数是否为NULL
?
@Query("SELECT DISTINCT c FROM Course c\n" +
"WHERE c.courseDate < CURRENT_TIME\n" +
"AND (?1 IS NULL OR (c.id NOT IN (3, 4, 5)))\n" +
"AND (?2 IS NULL OR (c.title LIKE ?2 OR c.description LIKE ?2))\n" +
"AND ((?3) IS NULL OR (c.category IN ?3)) ")
List<Course> getCoursesFiltered(Long courseId, String filter, List<Category> categories);
错误信息是:
无法提取ResultSet; SQL [n/a]; 嵌套异常为org.hibernate.exception.DataException: 无法提取ResultSet[SQL: 1241, 21000]
在堆栈跟踪中,我看到:
Caused by: java.sql.SQLException: 操作数应该包含1列
如果我的列表包含3个元素,则确实生成的查询将是... AND ((?3, ?4, ?5) IS NULL OR (c.category IN (?3, ?4, ?5)))
。但是IS NULL
不能应用于多个元素(如果我的列表只包含一个元素,则查询正常工作)。
我尝试过size(?3)< 1
、length(?3)< 1
、(?3)IS EMPTY
等方法,但仍然没有成功。
where X in (NULL)
中起作用,而是(?3) IS NULL
语句导致了问题。我的Course
类和实体映射非常基本,没有什么特别之处。我确实从管理器类调用存储库方法,我可以像你建议的那样做一些技巧,但我相信有更干净的方法来做到这一点 :) - Yann39