我正在写一个JPQL查询,它基于 Categories 集合进行查询。我的类别可以为空,因此我正在使用:categories = NULL进行检查。
@Query("Select v from Vendor v join v.org vorg join v.categories cats WHERE vorg.email =:email AND (cats in :categories or :categories = NULL)") Set<Vendor> filterVendors(@Param("emailId") String emailId, @Param("categories") Set<Category> categories);
当类别为NULL时,以上方法可以正常工作。但是,当类别超过一个值时,我得到了错误
java.sql.SQLException:操作数应包含1列
与hibernate有关的痕迹是
(?,?)或(?,?)中的category6_.category_id为null)
如何在JPQL中检查集合的null?我认为解决该问题应该可以解决此错误。任何帮助表示赞赏
谢谢。
所以我被困在做类似的事情。基本上,您要检查是否
问题在于没有好的方法来处理这部分:
:categories = NULL
这是因为当转换为SQL时,它将看起来像这样(当集合中有2个项目时):
@p0, @p1 = NULL
您也不能将其包装在括号中,因为这在SQL中无效:
(@p0, @p1) = NULL
我试图使用合并将值减小为NULL,但是我也无法使它起作用。
基本上,根据我的判断,JPQL中没有任何东西可以让您运行集合的某种功能(哈希集等)以查看其是否已填充。如果有人知道一个,请告诉我们。
最终,我诉诸黑客,在调用代码中检查集合以查看是否已填充集合。如果不是,我简单地再传递一个参数…一个空字符串。
String catString = ""; if (categoryList != null && !categoryList.isEmpty()) catString = "HasCats";
然后在JPQL中执行以下操作:
WHERE (:catsString = '' or cats IN (:categories)) "
这不是世界上最好的解决方案,但它是有效的。