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

Java 如果列表为空,中的休眠限制将导致错误,java,hibernate,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 ')' 下面是我的hibernate相关方法: @Override public List<SomeThing> findByIds(List<Integer&g

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

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 ')'
下面是我的hibernate相关方法:

  @Override
    public List<SomeThing> findByIds(List<Integer> someIds) {
        return sessionFactory.getCurrentSession().createCriteria(SomeClass.class)
                .add(Restrictions.in("id", someIds))
                .list();
    }
@覆盖
公共列表findByIds(列表someid){
返回sessionFactory.getCurrentSession().createCriteria(SomeClass.class)
.add(Restrictions.in(“id”,someid))
.list();
}
我应该做些什么来防止这个错误

我知道我可以短接电话并返回一个空列表,如:

if(someIds == null || someIds.size() == 0) {
  return new List<SomeThing>();
}
if(someIds==null | | someIds.size()==0){
返回新列表();
}

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

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

我唯一的建议就是使用
isEmpty()
函数和
!=
if
语句中的null
,并且很少重新构造为:

@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;
}
@覆盖
公共列表findByIds(列表someid){
List result=null;//可以使用空列表初始化
if(someIds!=null | |!someIds.isEmpty(){
结果=sessionFactory.getCurrentSession().createCriteria(SomeClass.class)
.add(Restrictions.in(“id”,someid))
.list();
} 
返回结果;
}
(这主要是基于@Yogendra Singh的回答,有一个转折点,使其更适用于常见的多个可选参数的情况)

CriteriaAPI旨在让您以编程的方式组合查询。这种动态特性应该在代码中处理

通常,我们通过以下方式制定可选标准:

@Override
public List<SomeThing> findBySearchParams(SearchParam searchParam) {
   // create criteria with mandatory search criteria
   Criteria criteria = sessionFactory.getCurrentSession()
                           .createCriteria(SomeClass.class);
                           .add(Restriction("someField", searchParam.getSomeField()));


   // add "id" only if "someId" contains value
   if(searchParam.getSomeIds() != null && !searchParam.getSomeIds().empty()) {
       criteria.add(Restrictions.in("id", searchParam.getSomeIds()));
   } 

   // add "anotherField" only if "anOptionalField" is not null
   if(searchParam.getAnOptionalField() != null) {
       criteria.add(Restrictions.in("anotherField", searchParam.getAnOptionalField()));
   } 

   return criteria.list();
}
然后你可以做一些看起来更聪明的事情:

SmartCriteriaBuilder criteriaBuilder = 
    new SmartCriteriaBuilder(sessionFactory.getCurrentSession().createCriteria());

criteriaBuilder .in("someField", listPossiblyNullOrEmpty);


return criteriaBuilder .toCriteria().list();    

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

我认为提供者/hibernate有责任检查空/空列表

可以想象其原因,它试图在org.hibernate.loader.CriteriaQueryTranslator或类似的地方构造where子句,类似于()中的id。但是因为这里的列表是空的,它将抛出一个异常。但是他们已经创建了带有(并且由于异常/空列表而无法完成)的查询

SmartCriteriaBuilder criteriaBuilder = 
    new SmartCriteriaBuilder(sessionFactory.getCurrentSession().createCriteria());

criteriaBuilder .in("someField", listPossiblyNullOrEmpty);


return criteriaBuilder .toCriteria().list();