三年總結出來的11個JPA和Hibernate查詢配置小技巧


JPA和Hibernate提供了一系列暗示hints能夠幫助你更好地定制你的查詢語言,這些小暗示或暗語是一種附加信息,你可以利用這些暗語做很多事情,比如設置查詢的timeout,使用實體圖或定義查詢緩存的緩存。

在我們介紹一系列暗語之前,首先我們看看如何使用查詢暗語,你可以在EntityManager.find 方法中使用它,EntityManager.find接受一個HashMap<String,Object>類型,該HashMap的值就是你提供的暗語設置,相當於提供一個附加參數。

EntityGraph<?> graph = em.getEntityGraph(“graph.AuthorBooks”);HashMap<String, Object> properties = new HashMap<>();properties.put(“javax.persistence.fetchgraph”, graph);em.find(Author.class, 1L, properties);

注意到properties是一個HashMap的值,里面是你要設置的暗語javax.persistence.fetchgraph

此外,Query接口提供了setHint(String name, Object value)方法來設置暗語:

EntityGraph<?> graph = em.getEntityGraph(“graph.AuthorBooks”);em.createQuery(“SELECT a FROM Author a”).setHint(“javax.persistence.fetchgraph”, graph).getResultList();

你也能使用@NamedQuery提供暗語設置:

@NamedQuery(name = “selectAuthors”, query = “SELECT a FROM Author a”, hints = @QueryHint(name = QueryHints.COMMENT, value = “a custom SQL comment”))

這樣暗語將在每個named query的實例中使用,你就不必再設置了:

em.createNamedQuery(“selectAuthors”).getResultList();

好了,上面介紹了使用方法,下面是暗語的列表介紹:

 

JPA Hints

1. javax.persistence.lock.timeout (Long – milliseconds)

獲得一個持久鎖的timeout

2. javax.persistence.query.timeout (Long – milliseconds)

定義了一個查詢在其被取消之前運行運行多長時間,Hibernate並不提供,而是希望借助JDBC驅動的 JDBCStatement.setTimeout 方法實現.

3. javax.persistence.cache.retrieveMode (CacheRetrieveMode – USE | BYPASS)

retrieveMode 支持值 USE 和 BYPASS ,告訴 Hibernate:如果使用USE ,使用二級緩存查詢返回一個實體,而使用 BYPASS 就是直接從數據庫獲得這個實體。

4. javax.persistence.cache.storeMode (CacheStoreMode – USE | BYPASS | REFRESH)

定義了如何將一個改變的實體寫入二級緩存中,使用 USE 表示使用緩存,如已經存在即修改,如緩存中不存在就將實體加入緩存,,如果使用BYPASS 只更新已經存在的實體,如果不存在就不加入緩存。如果使用 REFRESH,在實體從緩存中抓取之前首先將實體放入緩存。

5. javax.persistence.loadgraph (EntityGraph)

提供一個實體圖作為加載圖(load graph)給查詢。

6. javax.persistence.fetchgraph (EntityGraph)

提供一個實體圖作為一個fetchgraph用於查詢

 

下面是Hibernate Hints部分:

7. org.hibernate.flushMode (FlushMode – AUTO | ALWAYS | COMMIT | MANUAL)

如果你修改一個實體,Hibernate還在一級緩存中保留這些改變,直到全部flush到數據庫,默認情況下,這會在每次查詢之前發生flush,但是你能提供一個flushMode的值來控制flush的時機::

AUTO = 由Hibernate決定是否將修改后的實體寫入數據庫

ALWAYS = 在每次查詢之前都會寫入

COMMIT = Hibernate不會將修改寫入數據庫直到事務被提交了

MANUAL = 你得自己將會話中修改flush到數據庫中。

8. org.hibernate.readOnly (boolean)

如果你不想將任何修改應用到實體,你能設置這個值為真true,這會失效Hibernate的臟數據檢查,提高性能。

9. org.hibernate.fetchSize (Long – number of records)

Hibernate提供這個值給JDBC驅動,定義在一個批處理的查詢行數,這能提高JDBC和數據庫之間的通訊效率。

10. org.hibernate.comment (String – custom comment)

如果在persistence.xml 文件設置這個值true, Hibernate會為每個查詢產生一個comment,將其寫入到日志文件,如果你需要分析巨量和復雜SQL日志有用。

11. org.hibernate.cachable

如果你要使用Hibernate的查詢緩存,你得在persistence.xml 文件中配置它,將這個值設為true。

 

寫在最后:歡迎留言討論,加關注,持續更新!!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM