当前位置: 首页 > 面试题库 >

在JPQL查询中的集合上检查NULL?

琴英华
2023-03-14
问题内容

我正在写一个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时,以上方法可以正常工作。但是,当类别超过一个值时,我得到了错误

html" target="_blank">java.sql.SQLException:操作数应包含1列

与hibernate有关的痕迹是

(?,?)或(?,?)中的category6_.category_id为null)

如何在JPQL中检查集合的null?我认为解决该问题应该可以解决此错误。任何帮助表示赞赏

谢谢。


问题答案:

所以我被困在做类似的事情。基本上,您要检查是否

  1. 您传递的集合为空:然后不要在查询中包括它
  2. 您要传递的集合已填充:然后将其包括在查询中

问题在于没有好的方法来处理这部分:

: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)) "

这不是世界上最好的解决方案,但它是有效的。



 类似资料:
  • 问题内容: 建议的用于检查查询是否返回任何结果的惯用法是什么? 例: 我想有几种不同的检查方法,但是我想知道一个有经验的Django用户将如何做。文档中的大多数示例只是忽略了什么都没有发现的情况… 问题答案:

  • 我有两个JPA实体 现在我想用JPQL做一些聚合查询: 得到的SQL查询(我使用的是MySQL数据库)如下所示:

  • 问题内容: 我正在尝试在NHibernate中编写查询。我不在乎是否使用Criteria API或HQL,只是无法弄清楚如何编写查询。 这是我的模型: 我希望查询返回所有包含注释的工作流,该注释在注释的内容中包含特定的单词。 在伪SQL中,我将这样写: 问题答案: 我不确定Criteria API,但即使搜索仅存在于特定子类中的属性,HQL似乎也能很好地处理多态查询。我希望以下工作:

  • 我有一个实体,包含s的嵌入式集合。 我想找到集合中与给定参数(字符串)匹配的所有s。 我想在JPQL中实现的一些伪代码: 但是,当我尝试此查询时: 它抛出: 我希望避免使用需要连接多个表的解决方案。这是伪代码,但实际查询中充满了大量复杂的大型企业sql where或and语句。所以越少加入越好。

  • 问题内容: 如何限制JPQL命名查询的选择查询?我需要在查询级别本身而不是在Java层中完成限制!!!我正在尝试使用 但徒劳!!! 请建议 问题答案: 没有提供限制查询的机制。这通常是通过使用上的方法来实现的。如果必须避免在Java代码中指定此内容,则可以在包含查询并执行限制的数据库中进行查看。然后像将表一样将实体映射到此视图。 例: