如果列表为空,则Hibernate限制会导致错误

Bla*_*man 16 java hibernate

如果我的列表为空,则会出现以下错误:

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 ')'
Run Code Online (Sandbox Code Playgroud)

下面是我的hibernate相关方法:

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

我该怎么做才能防止这个错误?

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

if(someIds == null || someIds.size() == 0) {
  return new List<SomeThing>();
}
Run Code Online (Sandbox Code Playgroud)

但有没有更优雅的方式来做到这一点?

Mad*_*ddy 14

我想说Hibernate需要解决这个问题,并给出有意义的消息.

我认为它的提供者/ hibernate的责任是检查空/空List.

可以想象原因,它试图构造where子句,比如id in(),org.hibernate.loader.criteria.CriteriaQueryTranslator或类似的东西.但是因为这里List是空的,所以会抛出异常.但是他们已经创建了查询(并且由于异常/空List而无法完成.


Yog*_*ngh 13

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

我唯一可以建议是使用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;
}
Run Code Online (Sandbox Code Playgroud)