Java 在JPQL查询中检查集合是否为NULL?

Java 在JPQL查询中检查集合是否为NULL?,java,mysql,hibernate,jpa,jpql,Java,Mysql,Hibernate,Jpa,Jpql,我正在编写一个JPQL查询,它基于类别集合进行查询。我的类别可以为null,因此我使用: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("e

我正在编写一个JPQL查询,它基于类别集合进行查询。我的类别可以为null,因此我使用: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);
@Query(“从供应商v选择v加入v.org vorg加入v.categories猫,其中vorg.email=:email和(cats in:categories或:categories=NULL)”)
设置filterVendors(@Param(“emailId”)字符串emailId,@Param(“categories”)设置categories);
当categories为NULL时,上述方法可以正常工作。但是,当类别超过一个值时,我会得到错误

java.sql.SQLException:操作数应包含1列

与hibernate相关的跟踪是

中的类别6.类别id( ? , ? ) 或( ? , ? )是空的 )

如何在JPQL中检查集合上的null?我认为解决这个问题应该解决这个错误。谢谢你的帮助

谢谢

Select v from Vendor v join v.categories cats WHERE vorg.email =:email AND (cats in :categories or cats IS EMPTY)
您可以使用
IS[NOT]EMPTY
操作符测试空集合。JPA不一定返回空集合。仔细想想,DB返回一个空集合


哦,我修复了你的查询(虽然我没有测试它)。

所以我一直在做类似的事情。基本上你要检查一下

  • 您传递的集合为空:那么不要将其包含在查询中
  • 将填充您要传递的集合:然后将其包含在查询中
  • 问题是没有处理此部件的好方法:

    :categories = NULL
    
    这是因为,当转换为SQL时,它看起来会像这样(当集合中有两个项目时):

    也不能将其括在括号中,因为这在SQL中无效:

    (@p0, @p1) = NULL
    
    我尝试使用coalesce将值减少到NULL,但我也无法让它工作

    基本上,从我所知道的,JPQL中没有任何东西可以让您运行集合(hashset等)的某种函数来查看它是否被填充。如果有人知道,请告诉我们

    最后,我求助于黑客,在调用代码中,我检查集合,看它是否被填充。如果不是我简单地传入一个参数。。。空字符串

    String catString = "";
    if (categoryList != null && !categoryList.isEmpty()) catString = "HasCats";
    
    然后在JPQL中执行以下操作:

    WHERE (:catsString = '' or cats IN (:categories)) "
    

    这不是世界上最好的解决方案,但它很实用

    我可以这样得到它:

    coalesce(:myIdCollection, null) is null or id in (:myIdCollection)
    

    如果任何使用PostgreSQL的人遇到此问题,可以通过添加括号轻松解决:

    (cats in :categories or (:categories) IS NULL)
    

    1-what's vorg.email vorg不是别名。2-:email和@param define名称为“emailId”,有一个小的打字错误。现在改正了,希望现在很清楚了。谢谢。我正在测试上面的内容,当集合发送为空时,会得到一些SQL语法错误。我很好奇,为什么你要测试猫是空的?我们不应该检查param categories是否为空吗?因为
    cats
    已经声明并分配给
    v.categories
    。抱歉,您的建议尝试了很多次,但都无效。是的,感谢您在将近一年后的努力回答这个问题。1年后,我认为您所建议的是唯一的方法-我使用类似的方法,或者在参数列表很长的情况下使用本机查询。为了让它更干净,您可以使用ApacheUtils或ToDoList的null和isEmpty一次性检查。像这个CollectionUtils.isNotEmpty(categoryList)在您的if条件下。apace utils中的isNotEmpty方法将检查null和空条件。非常感谢。你救了我一天。在我读到的所有建议中,这是我唯一尝试过的有效建议。非常感谢。
    (cats in :categories or (:categories) IS NULL)