2011-07-01 93 views
0

我在hibernate中有一個查詢,我相信這是因爲在這裏討論的驅動程序和MsSql中的VARCHAR和NVARCHAR差異Getting Hibernate and SQL Server to play nice with VARCHAR and NVARCHAR。我明白這個問題不在Hibernate中,但是由於hibernate處理下面的代碼而感到困惑。當我們運行下面的查詢(使用set參數並且沒有它)時,在列'code'的VARCHAR列類型的數據庫中,我們發現在HQL中追加字符串的速度比setParameter(或Criteria Query這應該比HQL更快)。VarChar MsSql列上的各種Hibernate查詢的性能差異

Query createQuery = session.createQuery("from abc where code='"+substring+"'"); 
/*Query createQuery = session.createQuery("from abc where code=:substring"); 
       createQuery.setParameter("substring","Test");*/ 
       return createQuery.list(); 

請讓我知道這將有所作爲。

回答

0

數據庫計算出的執行計劃在兩個查詢之間可能不同。在this question中描述了類似的問題,我的DBA已經告訴我,Oracle也會出現同樣的問題。

+0

但爲什麼我的標準查詢更慢? 。我很困惑,因爲設置sendStringParametersAsUnicode = false給了我類似於我追加參數的查詢的性能。 HQL中的setParameter似乎與Criteria具有相同的性能。那麼,是直接將參數追加到Query中,以幫助克服數據庫問題中的VARCHAR? –

+0

如果在HQL查詢中沒有任何參數(即,當您使用字符串連接並且不必在查詢上調用setParameter),那麼JDBC驅動程序沒有任何要發送的參數。在這種情況下,sendStringParametersAsUnicode是不相關的。當你有一個參數化的HQL查詢時,或者當你使用Criteria API時,Hibernate會生成預處理語句,然後JDBC驅動程序發送參數。在這種情況下,sendStringParametersAsUnicode是相關的。 –

+0

@Nizet:現在我明白了。非常感謝。 –