Лучше использовать один запрос, используя @NamedQuery
, чтобы получить результаты в одной строке или использовать createQuery
?JPA createQuery или @NamedQuery
У меня есть следующие в 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
я мог бы использовать либо createQuery
или вызвать createNamedQuery
, определенный в классе сущностей.
Причина, по которой я использовал createQuery
, заключается в том, что я хотел бы фильтровать и получать результаты на основе состояния фильтра. Если я использую createNamedQuery
, тогда мне нужно добавить условие where в @NamedQuery
и, самое главное, мне нужно проверить, является ли условие фильтра нулевым или нет, если оно равно нулю, то я использую какой-то дикий символ, например %
, чтобы получить все результаты из базы данных, которые могут вызвать задержку.
Поэтому у меня есть два сомнения
Что лучше использовать
createQuery
использовать фильтр или эффективный поиск , там выполнить несколько операторов SQL, которые основаны на моих отображениях и присоединяются?Лучше использовать
@NamedQuery
и иметь условия, и выполнить только один sql с соединениями?
Любое понимание или ввод или помощь являются очень заметными.
Возможно [этот другой вопрос] (http://stackoverflow.com/questions/15596025/hibernate-named-queries-and-its-performance-advantage) поможет. – Angga
@Angga Интересно, имеет ли проблема с производительностью, когда используется 'createQuery', поскольку он выполняет несколько операторов sql, а не один sql в случае' @ NamedQuery' из-за 'join fetch'? – user75ponic