我想轉換執行SQL的舊應用程序查詢,如下的老路上:Hibernate的HQL的createQuery
java.sql.Connection connection = ....
String queryStr="select acct from Person where acct in (select acct from Document where dbcreate_date > DATEADD(hh,-12, GETDATE())) and status not in ('A','P')";
...
...
java.sql.Statement statement = connection.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
rs = statement.executeQuery(queryStr);
上面的代碼需要大約10毫秒。這包括獲取數據庫連接,創建語句並執行查詢。
我現在使用Hibenate HQL並創建了一個HQL這樣的查詢:
Query query = session.createQuery("select p.acct from Person p where p.acct in (select acct from Document d where create_date > :date and status not in ('A','P'))");
現在只是這種說法「session.createQuery(......)」走約105毫秒,這大約是如上所述,以舊方式完成整個查詢內容的時間再延長10倍。
現在我不太確定Hibernate查詢緩存是如何工作的,但是如果我第二次運行這個相同的HQL語句,它將需要大約5毫秒。
現在我的問題是爲什麼使用Hibernate HQL發生這種行爲?任何人都知道「session.createQuery(...)」方法裏面發生了什麼,第一次需要更長的時間,但第二次運行的時間要少得多? 我也注意到,Hibernate在執行「query.list()」時都會對數據庫執行SQL。
謝謝。
是的它是有道理的。我是Hibernate緩存的新手,但我開始明白它的好處以及如何正確使用它。感謝您的回答。 – Marquinio 2012-04-10 01:21:37