当前位置: 首页 > 知识库问答 >
问题:

如何检查hql中的集合参数是否为空?

梁丘飞鸾
2023-03-14

那么如何在HQL中检查集合是否为空?简单的例子:

select * from Book book where title in (:titles)

如果标题是一个变量,我可以

select * from Book book where (:titles is null or title in (:titles))

但是如果标题是一个列表/集合呢?

select * from Book book where (:titles is null or title in (:titles))

如果标题是列表,这将不起作用。经过激烈的搜索,我尝试了是空的、大小的和存在的函数,我还尝试了(: title)是空选项。

以上都不起作用。我知道有一种硬编码方式,根据标题列表的状态编写不同的查询,如果为空,则一个查询,如果为空,则另一个查询。但这将产生许多类似的HQL查询,只需稍作修改。我的用例没有更多的列表需要考虑,所以这不是我想要的。

我的问题是,是否可以直接在HQL中进行检查?

共有1个答案

隗翰海
2023-03-14

:标题是一个列表。
您要搜索具有这些“标题”的书籍。

用户,

  • 可能选择了一个标题
  • 可能选择了多个标题
  • 或者根本没有选择任何标题

所以这个列表可能是空的,其中可能有一个或多个元素。

在任何情况下,您都将使用查询。setParameterList(),以便将标题集合传递到查询中,如本答案中所述。

那么,如果您试图传递的参数可能为空,您就不会想要使用set方法。毕竟,我们在这里讨论的Java。

所以,你需要的是检查这个列表是否为空<此外,您不想让hibernate检查用户选择的标题列表是否为空
您也只需要一个查询,不需要多个查询。

实现这一点的方法是使用查询生成器<有许多方法可以实现这种方法。但总的来说

>

  • 要么使用专门用于此类工作的框架,如Querydsl,请点击此处
  • 或者您可以简单地使用StringBuilder来构建查询的select、from和where子句,例如:

    Map<String,Object> params = new HashMap<String,Object>();
    StringBuilder queryBuilder = new StringBuilder();
    queryBuilder.append(" from Book book ");
    if(!titlesList.isEmpty()){
        queryBuilder.append(" where book.title in (:titles) ");
        params.put("titles", titlesList);
    }
    Query query = entityManager.createQuery(queryBuilder.toString());
    for ( Map.Entry<String,Object>; param : params.entrySet()) {
        if(param instanceof Collection<?>){
            query.setParameterList(param.getKey(),param.getValue());
        }
        //if param is of type String then query.setString etc. 
        //else setParameter, you get the idea, use the docs
    }
    List<Book> results = (List<Book>) query.list();
    

  •  类似资料:
    • 问题内容: 我尝试生成一个HQL查询,其中包括带有空Appoinment集合(由OneToMany映射)的用户: 我尝试了几种方式() 但仍然不是我想要查看的结果或HQL或SQL SERVER中的某些错误 注意: 没有JOIN的查询有效: 解决了 另一个JOIN解决了这个问题: 问题答案: 使用应该可以(我希望使用JPQL语法): 如果没有,请显示生成的SQL。 参考文献 Hibernate Co

    • 我有一个具有如下结构的集合对象: 我该怎么办?非常感谢,很抱歉我的英语不好!

    • 问题内容: 我要实现以下功能: 如何检查向量元素类型? 请注意, 向量可能为空,因此我无法检查第一个元素是“ instanceof”整数还是String … 编辑: 好吧,我脑子里有个念头,我不知道它是否会起作用 我可以按以下方式实现checkType函数: 是否可以检查T是否为整数?! 提前致谢 问题答案: *由于 类型擦除, *泛型类型参数 在运行时不可恢复(某些特殊情况除外)。这意味着在运行

    • 大家好,我想检查一下,例如在Firebase中创建一个文档集合之前,如果object.name、object.title、object.velocity....只是一个空格("),或者它们在打字稿中为空(Ionic 4),但我认为还有另一种更快的方法,最好的建议是什么? 我所做的是,但我认为是这么长...: 非常感谢。

    • 问题内容: 通过使用Java反射,我们可以轻松知道对象是否为数组。判断对象是否为集合(Set,List,Map,Vector …)的最简单方法是什么? 问题答案: