2

@NamedQuery単一の行で結果を取得するために使用する単一のクエリを使用する方が良いcreateQueryですか?

私はDAOImplに次のものを持っています

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Project> c = cb.createQuery(Project.class);
Root<Project> prj = c.from(Project.class);
c.orderBy(cb.desc(prj.get("projectNo")));
c.select(prj);

CriteriaQuery<Long> countQ = cb.createQuery(Long.class);
Root<Project> prjCount = countQ.from(Project.class);
countQ.select(cb.count(prjCount ));

String projectNo = filters.get("projectNo");

List<Predicate> criteria = new ArrayList<Predicate>();
    if (projectNo != null) {
        ParameterExpression<String> pexp = cb.parameter(String.class,
            "projectNo");
    Predicate predicate = cb.like(prj.get(Project_.projectNo),
                    pexp);
            criteria.add(predicate);
        }
 if (criteria.size() == 1) {
    c.where(criteria.get(0));
        countQ.where(criteria.get(0));
    } else if (criteria.size() > 1) {
        c.where(cb.and(criteria.toArray(new Predicate[0])));
        countQ.where(cb.and(criteria.toArray(new Predicate[0])));
        }

 TypedQuery<Project> q = entityManager.createQuery(c);
 TypedQuery<Long> countquery = entityManager.createQuery(countQ);

TypedQueryどちらかを使用するか、Entity クラスで定義されたcreateQuery呼び出しを使用できます。createNamedQuery

使用した理由createQueryは、フィルター条件に基づいてフィルター処理して結果を取得したいからです。一方、を使用している場合createNamedQueryは、where 条件を追加する必要があり@NamedQuery、最も重要なこととして、フィルター条件が null かどうかを確認する必要があります。null の場合は、%データベースからすべての結果を取得するようなワイルド文字を使用します。これは遅延を引き起こす可能性があります。

だから私は2つの疑問があります

  • createQuery私のマッピングと結合に基づいて複数のSQL文を実行することによって、フィルターまたは検索を効果的に使用するために使用する方が良いですか?

  • @NamedQuerywhere条件を使用して、結合を使用して1つのSQLのみを実行する方が良いですか?

洞察、インプット、またはヘルプは非常に高く評価されます。

4

1 に答える 1

4

基本的@NamedQueryには と同じtypedQueryで、typedQuery は create query の結果です:

TypedQuery<USER> hql = entityManager.createQuery(query);

@NamedQuerytypedQueryis named queryの唯一の違いは、コード以外の場所であり、セッション ファクトリの作成時にチェックされます。

パフォーマンスの問題の違いは文字列の構築に関するものであるため、結合が数百または数千のテーブルにない限り、これら 2 つの違いは実際には見つかりません。

于 2013-07-28T11:46:33.373 に答える