Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate返回抛出的方法';org.hibernate.exception.sqlgrammareexception';例外。无法提取结果集_Java_Hibernate - Fatal编程技术网

Java Hibernate返回抛出的方法';org.hibernate.exception.sqlgrammareexception';例外。无法提取结果集

Java Hibernate返回抛出的方法';org.hibernate.exception.sqlgrammareexception';例外。无法提取结果集,java,hibernate,Java,Hibernate,我有一段代码 public List<Fruit> getFruits(final Set<Integer> ids) { final Criteria criteria = super.criteria().add(Restrictions.in("id", ids)); final List<Fruit> fruits = this.list(criteria); // throws SQLGrammarException fru

我有一段代码

public List<Fruit> getFruits(final Set<Integer> ids) {
    final Criteria criteria = super.criteria().add(Restrictions.in("id", ids));
    final List<Fruit> fruits = this.list(criteria);  // throws SQLGrammarException
    fruits.forEach(this::initializeFruit);
    return fruits;
}
public List getFruits(最终设置ID){
最终标准=super.Criteria().add(Restrictions.in(“id”,id));
最终列表结果=this.List(条件);//抛出SQLGrammarException
水果。forEach(这是:初始化柚子);
还果;
}
当提供空集时,它将在
this.list(criteria)
中抛出异常,“org.hibernate.exception.sqlgrammareexception”异常。无法提取结果集

有什么建议可以预防吗


谢谢

基本上,JPA就是这样设计的

逗号分隔列表中必须至少有一个元素定义in表达式的值集

处理您提到的空列表错误情况的最简单方法是完全跳过查询数据库,因为条件无论如何都不应该匹配任何条目:

public List<Fruit> getFruits(final Set<Integer> ids) {
    final List<Fruit> fruits;

    if (ids.isEmpty()) {
        fruits = Collections.emptyList();
    } else {
        final Criteria criteria = super.criteria().add(Restrictions.in("id", ids));
        fruits = this.list(criteria);
        fruits.forEach(this::initializeFruit);
    }

    return fruits;
}
public List getFruits(最终设置ID){
最后的水果清单;
if(id.isEmpty()){
fruits=Collections.emptyList();
}否则{
最终标准=super.Criteria().add(Restrictions.in(“id”,id));
水果=此列表(标准);
水果。forEach(这是:初始化柚子);
}
还果;
}

这不是JPA错误,而是SQL错误,大多数SQL引擎不支持空的
IN
子句。条件不应该与任何条目匹配,这难道不是一种假设吗?也许OP想要无限制地返回所有内容。当然这是JPA的事情,JPA也可以指定其实现必须遵循与我相同的回退方式,但他们选择以期望非空集的方式设计API,并让消费者处理潜在错误。JPA还可以指定传入一个空集会导致e。G一个例外,但他们没有。什么是合理的违约?什么也不退?不包括在?是否将空的
null
?对你来说合乎逻辑的东西可能不适合其他人,他们可能会有相反的想法。JPA只翻译成SQL,SQL不允许使用空IN子句,因此SQL中断。就像在编写纯SQL时创建一个空IN子句一样。但遗憾的是,这可能是一个不同的讨论/主题。我知道我的合理默认是什么,因为我只在想要限制结果时包含“in”限制。在我期望对某些条件没有限制的情况下加入硬编码限制,这正是人们编写代码的模糊方式,它占用了每一位读者理解所有不必要的复杂性的时间,而不是编写简洁明了、易读的代码。