2009-09-09 49 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

國際海事組織更好的答案在這裏:http://stackoverflow.com/a/7770977/891479 – 2014-06-11 15:06:37

回答

5

我在鏈接到的問題(使用字符串常量命名查詢)中使用第二種方法。使用命名查詢的主要優點是Hibernate在啓動時解析查詢,以便快速檢測到任何錯誤。

至於你的整體方法,我肯定會問你的域模型,如果你需要命名查詢很多。對於某些應用程序來說,這是必要的,但也許會考慮用實體中的延遲加載替換連接。還請看例子和標準使用hobernate查詢,因​​爲這些也可以減少以面向對象方式使用命名查詢。

+0

+1的點「面向對象的方式」。 IMVHO,構建查詢的任務可以委託給查詢構建器的層次結構。 – CMR 2011-04-05 21:04:52

0

命名查詢可以提高應用程序的性能,因爲它們只需準備一次,而且它們(及其所有關聯的支持對象)之後都可以高效地重用,從而使它們非常適合複雜且頻繁執行的操作。

有關其他性能調整方法,請參閱here (jpa performance)here (Hibernate performance) on DZone

相關問題