18

これは非常に単純な質問のように思えますが、まだ決定的な答えを見つけることができていません。基準クエリを使用してデータベースを自然にクエリするDAOクラスがあります。したがって、異なるクエリの作成に同じ CriteriaBuilder 実装を使用しても安全かどうか、またはクエリごとに新しい CriteriaBuilder インスタンスを作成する必要があるかどうかを知りたいです。次のコード例は、私がやりたいことを示しているはずです:

public class DAO() {  
    CriteriaBuilder cb = null;

    public DAO() {
        cb = getEntityManager().getCriteriaBuilder();
    }

    public List<String> getNames() {
        CriteriaQuery<String> nameSearch = cb.createQuery(String.class);
        ...
    }

    public List<Address> getAddresses(String name) {
        CriteriaQuery<Address> nameSearch = cb.createQuery(Address.class);
        ...
    }
}

これをしても大丈夫ですか?

4

4 に答える 4

16

JPA 2.0 仕様 (JSR 317) のセクション3.1.1 EntityManager Interfaceの javadoc を読む:

/**
 * Return an instance of CriteriaBuilder for the creation of
 * CriteriaQuery objects.
 * @return CriteriaBuilder instance
 * @throws IllegalStateException if the entity manager has
 *         been closed
 */
public CriteriaBuilder getCriteriaBuilder();

そして、この直後のコメント:

エンティティ マネージャから取得したQueryTypedQueryCriteriaBuilderMetamodelおよび EntityTransactionオブジェクトは、そのエンティティ マネージャが開いている間は有効です。

セクション6.5 基準クエリの構築

インターフェイスは、オブジェクトCriteriaBuilderを構築するために使用されCriteriaQuery ます。CriteriaBuilder 実装には 、または インターフェイスのgetCriteriaBuilderメソッドを 介してアクセスします。EntityManagerEntityManagerFactory

CriteriaBuilderエンティティマネージャーの存続期間中、単一のクエリを再利用して多くのクエリを作成できると期待しています。しかし、それは私の解釈です。ただし、私の最初のテストでは、それには何も問題がないことが確認されているようです (逆の場合は、本当に恐ろしいことです)。

于 2010-05-21T23:42:29.680 に答える
1

これは安全です。

CriteriaBuilderはEntityManagerFactoryから取得できます。休止状態の実装では、criteriaBuilderはEntityManagerFactoryのインスタンスのフィールドです。したがって、従来の場合、リスクはありません。

于 2011-02-03T17:53:43.107 に答える
1

Eclipse Link は、クエリを開始するとランダムな方法でエラー (EclipseLink-6089、org.eclipse.persistence.exceptions.QueryException) を生成し (機能する場合と機能しない場合があります)、最初のクエリを実行する前に別のエラーを生成します。詳細については、スタック オーバーフローJBoss の問題を参照してください。

クエリを 1 つずつ実行する場合、または Hibernate を使用する予定がある場合は、CriteriaBuilder を再利用しても問題ありません。

于 2012-01-20T20:55:41.163 に答える
1

興味深い質問です。「もちろん、それが基準クエリの要点です」と言うでしょうが、ここでこれを裏付ける単語は1つも見つかりませんでした: http://java.sun.com/javaee/6/docs/tutorial/doc/gjivm .html

ただし、それらが再利用可能でない場合、エンティティマネージャーが実際にそれらを変更することになり、ひどい API 設計になります。だから:再利用できることを願っていますが、保証はできません

于 2010-05-19T19:12:12.540 に答える