query.setParameterList(name, (Collection<?>) list);
如果setParammeterList 中的list 为空的话,hibernate 映射会找不到该list 的值。会报注意事项ORA-00936: 缺失表达式。
为什么呢 ? 我们开启sql 打印:
select ...... from XXX a where a.sbxh in (:list)
在控制台输出:
select ...... from XXX a where a.sbxh in ()
明白在哪里没有? 对了 这个变量不见了!!!!
原本应该是select ...... from XXX a where a.sbxh in (?) ,然后再去匹配变量
因为这时候变量为空后,oracle 执行找不到,以为在执行 in() in后面没内容 当然报错啦。
我们看一下 hibernate 中query 的setParameterList 源码:
public Query setParameterList(String name, Collection vals) throws HibernateException {
if ( vals == null ) {
throw new QueryException( "Collection must be not null!" );
}
if( vals.size() == 0 ) {
setParameterList( name, vals, null );
}
else {
setParameterList(name, vals, determineType( name, vals.iterator().next() ) );
}
return this;
}
@Override
public Query setParameterList(String name, Collection vals, Type type) throws HibernateException {
if ( !parameterMetadata.getNamedParameterNames().contains( name ) ) {
throw new IllegalArgumentException("Parameter " + name + " does not exist as a named parameter in [" + getQueryString() + "]");
}
namedParameterLists.put( name, new TypedValue( type, vals ) );
return this;
}
如上:setParameterList 中type 为空以后 导致name对应的type 的值为空。