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 的值爲空。