spring hibernate 中 setParameterList

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

發佈了27 篇原創文章 · 獲贊 46 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章