2013-07-28 2 views
1

Лучше использовать один запрос, используя @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 с соединениями?

Любое понимание или ввод или помощь являются очень заметными.

+0

Возможно [этот другой вопрос] (http://stackoverflow.com/questions/15596025/hibernate-named-queries-and-its-performance-advantage) поможет. – Angga

+0

@Angga Интересно, имеет ли проблема с производительностью, когда используется 'createQuery', поскольку он выполняет несколько операторов sql, а не один sql в случае' @ NamedQuery' из-за 'join fetch'? – user75ponic

ответ

3

В основном @NamedQuery это так же, как typedQuery, typedQuery является результатом создания запроса:

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

Единственное различие между @NamedQuery и typedQuery называется запрос на разностной месте, чем код, и проверяется, когда сессия фабрика создана.

Разница в производительности - это всего лишь построение строк, поэтому, если ваше соединение не находится в сто или тысячах таблиц, вы действительно не найдете разницы в этих двух.

+0

Angga '@ NamedQuery' и' createQuery', а не 'typedQuery' :-) У меня нет сотен табличных соединений, менее 10 или 15. Поэтому я не думаю, что это будет иметь проблемы с производительностью, если один запрос выполняется в случай '@ NamedQuery', потому что у меня есть' join fetch', определенный для объединения таблиц. Хотя для использования условия фильтра я использую 'createQuery'. – user75ponic

+0

извините, возможно, что я сказал, и мой пример кода имеет missmatch. я сказал, что '.createQuery()' имеет тип возвращаемого типа TypedQuery и '.CreateNamedQuery()' также возвращает TypedQuery. поэтому оба из них имеют точно такое же значение сгенерированного SQL, если HQL - то же самое, разница только в том, где они получают String. – Angga

+0

_results_ те же, но вопрос был в том, что _better_. '@ NamedQuery' может быть предварительно скомпилирован при запуске приложения, и в этом случае он будет более эффективным. – MattR

Смежные вопросы