检查 JPQL 查询中集合的 NULL?
Checking for NULL on a Collection in JPQL queries?
我正在编写一个基于 Categories 集合进行查询的 JPQL 查询。我的类别可以为空,因此我正在使用 :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: Operand should contain 1 column(s)
休眠相关的跟踪是
category6_.category_id in (
? , ?
)
or (
? , ?
) is null
)
如何检查 JPQL 中集合的空值?我认为解决这个问题应该可以解决这个错误。任何帮助表示赞赏
谢谢。
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 不一定带回 NULL 集合。想想看,DBreturns一个空集合
哦,我修正了你的查询(虽然我没有测试它)。
所以我一直在做类似的事情。基本上你想检查是否有
- 您传入的集合是空的:那么不要将其包含在查询中
- 您传入的集合已填充:然后将其包含在查询中
问题是没有好的方法来处理这部分:
:categories = NULL
这是因为当翻译成 SQL 时,它将看起来像这样(当集合中有 2 个项目时):
@p0, @p1 = NULL
你也不能用括号括起来,因为这在 SQL:
中是无效的
(@p0, @p1) = NULL
我尝试使用 coalesce 将值减少到 NULL,但我也无法让它工作。
基本上据我所知,JPQL 中没有任何东西可以让您 运行 某种集合函数(哈希集等)来查看它是否被填充。如果有人知道,请告诉我们。
最后我求助于 hack,在调用代码中我检查集合以查看它是否已填充。如果不是我简单地再传递一个参数......一个空字符串。
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)
我正在编写一个基于 Categories 集合进行查询的 JPQL 查询。我的类别可以为空,因此我正在使用 :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: Operand should contain 1 column(s)
休眠相关的跟踪是
category6_.category_id in ( ? , ? ) or ( ? , ? ) is null )
如何检查 JPQL 中集合的空值?我认为解决这个问题应该可以解决这个错误。任何帮助表示赞赏
谢谢。
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 不一定带回 NULL 集合。想想看,DBreturns一个空集合
哦,我修正了你的查询(虽然我没有测试它)。
所以我一直在做类似的事情。基本上你想检查是否有
- 您传入的集合是空的:那么不要将其包含在查询中
- 您传入的集合已填充:然后将其包含在查询中
问题是没有好的方法来处理这部分:
:categories = NULL
这是因为当翻译成 SQL 时,它将看起来像这样(当集合中有 2 个项目时):
@p0, @p1 = NULL
你也不能用括号括起来,因为这在 SQL:
中是无效的(@p0, @p1) = NULL
我尝试使用 coalesce 将值减少到 NULL,但我也无法让它工作。
基本上据我所知,JPQL 中没有任何东西可以让您 运行 某种集合函数(哈希集等)来查看它是否被填充。如果有人知道,请告诉我们。
最后我求助于 hack,在调用代码中我检查集合以查看它是否已填充。如果不是我简单地再传递一个参数......一个空字符串。
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)