@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文を実行することによって、フィルターまたは検索を効果的に使用するために使用する方が良いですか?@NamedQuery
where条件を使用して、結合を使用して1つのSQLのみを実行する方が良いですか?
洞察、インプット、またはヘルプは非常に高く評価されます。