如果列表中为空,则 中的休眠限制会导致错误

2022-09-02 12:19:31

如果我的列表为空,我会收到以下错误:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')'

以下是我的休眠相关方法:

  @Override
    public List<SomeThing> findByIds(List<Integer> someIds) {
        return sessionFactory.getCurrentSession().createCriteria(SomeClass.class)
                .add(Restrictions.in("id", someIds))
                .list();
    }

我应该怎么做才能防止此错误?

我知道我可以缩短呼叫并返回一个空列表,例如:

if(someIds == null || someIds.size() == 0) {
  return new List<SomeThing>();
}

但是有没有更优雅的方法来做到这一点呢?


答案 1

我会说Hibernate需要解决这个问题,并给出有意义的信息。

我认为它的提供者/休眠器有责任检查空/空列表。

人们可以想象原因,它试图构造 where 子句,类似于 () 中的 id,在 org.hibernate.loader.criteria.Criteria.CriteriaQueryTranslator 或类似的地方。但是,由于此处的列表为空,因此将引发异常。但是他们已经使用 ( 创建了查询,并且由于异常/空列表而无法完成。


答案 2

不。如果使用子句的空参数执行查询,它将失败(您可以通过运行纯 SQL 来验证这一点)。如果输入参数为 null/empty,最好不要执行查询。in

我唯一能建议的是使用函数和语句和小重组作为:isEmpty()!= nullif

@Override
public List<SomeThing> findByIds(List<Integer> someIds) {
   List<Something> result = null; //you may initialize with empty list
   if(someIds != null || !someIds.isEmpty() {
       result = sessionFactory.getCurrentSession().createCriteria(SomeClass.class)
            .add(Restrictions.in("id", someIds))
            .list();
   } 
   return result;
}

推荐