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”限制。在我期望对某些条件没有限制的情况下加入硬编码限制,这正是人们编写代码的模糊方式,它占用了每一位读者理解所有不必要的复杂性的时间,而不是编写简洁明了、易读的代码。