2009-09-09 1 views
4

Существуют ли какие-либо преимущества использования именованных запросов в сравнении с тем, что у нас есть? Глядя на производительность, удобство использования, ремонтопригодность и т.д. и т.п ....Каковы преимущества использования названных запросов в Hibernate Annotation

В нашем приложении мы определили наши запросы, как, например:

private static final String SELECT_CODE_FOR_STORE = "select DISTINCT code from Code code " 
     + "join code.codeDescriptions codeDesc " 
     + "join codeDesc.stores store where store.id =:" 
     + DataAccessConstants.PARAM_STORE_ID; 

(Они все помещены в объект DAO и есть многие из них .)

И мы называем выше с помощью:

Map<String, Object> paramMap = new HashMap<String, Object>(); 
paramMap.put("storeId", codeDescriptionSearchCriteria.getStoreId()); 
List<Code> list = getJpaTemplate().findByNamedParams(
     SELECT_CODE_FOR_STORE, paramMap); 
return list; 

Который ничего более:

public List findByNamedParams(final String arg0, 
           final Map<String, 
           ? extends Object> arg1) throws DataAccessException 
{ 
    return org.springframework.orm.jpa.JpaTemplate.findByNamedParams(arg0, arg1); 
} 

По сравнению с использованием

@NamedQuery(name="SELECT_CODE_FOR_STORE", query="select ......") 

А в верхней части нашего объектов DAO.

Я видел this posting, который, кажется, является хорошим способом организовать все эти запросы. Или, может быть, настало время переоценить нашу базу данных и структуры объектов, если у нас так много таких запросов.

+1

IMO лучше ответы здесь: http://stackoverflow.com/a/7770977/891479 –

ответ

5

Я использую второй подход в вопросе, который вы связали с (именованными запросами со строковыми константами). Основным преимуществом использования именованных запросов является то, что Hibernate анализирует запросы при запуске, поэтому любые ошибки будут обнаружены быстро.

Что касается вашего общего подхода, я бы определенно поставил под вопрос вашу модель домена, если вам нужны именованные запросы. Для некоторых приложений это необходимо, но, возможно, посмотрите на замену объединений на ленивые нагрузки в сущности. Также посмотрите на использование запроса hobernate по примерам и критериям, поскольку они также могут уменьшить использование именованных запросов объектно-ориентированным способом.

+0

+1 для точки «Объектно-ориентированный путь». IMVHO, задача построения запросов может быть делегирована иерархии разработчиков запросов. – CMR

0

Именованные запросы улучшают производительность приложений, поскольку они готовятся один раз, и они (и все связанные с ними поддерживающие объекты) могут быть эффективно повторно использованы после этого, что делает их хорошо подходящими для сложных и часто выполняемых операций.

Для других средств настройки производительности см. here (jpa performance) и here (Hibernate performance) on DZone.