我有一堆希望遷移到Spring Data JPA的JPA DAO.我的某些DAOS具有第二級(jí)/查詢緩存設(shè)置.
我有一個(gè)過程,我只在查詢中檢索ID,然后使用findByID()查找實(shí)體.這樣,只有ID會(huì)在不同的查詢緩存中相乘,而整個(gè)實(shí)體都在第二級(jí)緩存中.
例:
@NamedQuery(name = "SystemUser.findByEmail", query = "SELECT u.id FROM SystemUser u WHERE email=:email"),…public SystemUser findByEmail(String email) { TypedQuery<Long> q = getEntityManager().createNamedQuery("SystemUser.findByEmail", Long.class); q.setParameter("email", email); q.setHint("org.hibernate.cacheable", true); q.setHint("org.hibernate.cacheRegion", "query.systemUser"); List<Long> res = q.getResultList(); if (res != null && res.size() > 0) { return findById(res.get(0)); } return null;}
我還有更多的findBy…方法,所有方法都是這樣.感覺這是降低緩存內(nèi)存消耗的好方法.
我是Spring Data JPA業(yè)務(wù)的新手,但是我看不到如何在這里實(shí)現(xiàn)它? @Cacheable批注似乎只處理查詢緩存,對(duì)我而言,這些副本將復(fù)制每個(gè)查詢緩存中的實(shí)體嗎?
Spring Data有什么辦法做到這一點(diǎn)?指針將不勝感激.
解決方法:
在Spring Data JPA中,只需創(chuàng)建一個(gè)findByEmail方法,Spring Data JPA就會(huì)找到您的命名查詢或自行創(chuàng)建一個(gè)查詢.
public class SystemUserRepository extends CrudRepository<SystemUser, Long> { SystemUser findByEmail(String email);}
應(yīng)該是執(zhí)行查詢和所需結(jié)果所需要的.現(xiàn)在使用@QueryHints,您可以添加您現(xiàn)在設(shè)置的提示.
public class SystemUserRepository extends CrudRepository<SystemUser, Long> { @QueryHints( @QueryHint(name="org.hibernate.cacheable", value="true"), @QueryHint(name="org.hibernate.cacheRegion", value="query.systemUser") ) SystemUser findByEmail(String email);}
結(jié)果將被緩存,而用戶仍然來自第二級(jí)緩存(如果可用,則創(chuàng)建其他).假設(shè)您的實(shí)體當(dāng)然是@Cacheable.
可以找到有關(guān)07個(gè)不同緩存如何一起工作的很好的讀物here.有關(guān)查詢緩存如何工作的小片段.
The query cache looks conceptually like an hash map where the key is composed by the query text and the parameter values, and the value is a list of entity Id’s that match the query:
如果您想要更復(fù)雜的邏輯(并真正實(shí)現(xiàn)您所做的優(yōu)化),則始終可以實(shí)現(xiàn)own repository.
來源:https://www.icode9.com/content-4-529601.html聯(lián)系客服