2012-01-24 9 views
6

Criteria vs HQLを使用する場合、私は休止状態を辿っていましたが、私が理解するのはHibernateで、毎回CriteriaまたはHQLのいずれかのデータベースでクエリを実行すると、両方のインスタンスでhibernateが結果セットを取得してメモリに格納し、再度クエリを実行すると、データがメモリからフェッチされ、そのデータベースにヒットすることはありませんが、私の理解は正しいですか?HQLクエリは常にデータベースに達し、結果を取得しますか?

また、下記のコメントから分かるように、Hibernate Criteriaがセッションからデータを取得し、HQLが常にデータベースにアクセスし、HQLクエリへの複数の呼び出しが行われ、データベースこれが当てはまる場合は、HQLが解決よりも多くの問題を引き起こします。

状況についてちょっと混乱しているように、これについて助言してください。 question

答えて

7

リファレンスそれはあなたが作っているクエリの種類にし、あなたのキャッシュの設定について依存します。

Hibernateには、セッションキャッシュ、クエリキャッシュ、第2レベルキャッシュという3種類のキャッシュがあります。セッションキャッシュは常にオンですが、他の2つは無効にすることができます。

通常、キャッシュは、Criteria APIをHQLよりも優先させる理由ではなく、その逆もあります。彼らは本質的に同じものに対して、たいていちょうど異なるインターフェースです。

基本的にhttp://www.javalobby.org/java/forums/t48846.htmlhttp://docs.jboss.org/hibernate/core/3.3/reference/en/html/performance.html

+1

AFAIKを使用します.HAQLクエリはクエリキャッシュのみを使用し、クエリとすべてのパラメータが同じ場合にのみ結果を取得します。 – Thomas

+0

"+ test.class.getName()+ SORT_BY_ID;'から ''を作成している場合、メモリやデータベースにヒットしているかどうかを判断するにはどうすればいいですか?また、hibernate v3.2のキャッシュ設定をどうすれば管理できますか? – Rachel

+0

@Juha:セッションがデフォルトでは常にオンであると言うと、HQLはセッションの権利から結果を取得し、再度データベースにアクセスしません。 – Rachel

1

を参照してください、あなたはおそらく、データベースをヒットするつもりクエリを生成している場合、この例外は、クエリやパラメータがキャッシュされてきた場合です。

Hibernateクエリ(CriteriaまたはHQLを使用しているかどうか)は、セッションキャッシュ(第1レベルキャッシュ)から@Idを取得した場合にのみエンティティを返します。

session.createQuery("from X as x").setCacheable(true); 

編集コメント:

クエリは@Idを取得と同じではありませんあなたは、次の構文を使用することができ、クエリをキャッシュするために

。オブジェクトを取得するには、

Entity myEntity = sessionFactory.getCurrentSession().get(Entity.class, 1); 
+0

'@ Id 'で取得するhibernateクエリの例を挙げることができます – Rachel

+0

このようなものは、HQLを使って主キー(@Id)をフェッチしますsession.createQuery(" Entity eからe.id =? ").setParameter (1、id) –

+0

これはセッションキャッシュにヒットしません。セッションキャッシュをバイパスしてデータベースに直接アクセスするクエリを作成しています。 @Idによって取得する場合は、セッションでLoadまたはGetを使用します。 –

関連する問題