Hibernate中set參數是從0開始,jpa中set參數是從1開始sql
二級緩存的使用(目的是能夠跨EntityManager使用,而一級緩存只在一個EntityManager)數據庫
1.加入hibernate的lib/optional/ehcache中的所有,再導\project\etc中的ehcache.xml配置文件數組
2.在persistence.xml中配置二級緩存和
緩存
3.在須要被二級緩存的實體類上加@Cacheable(true)測試
注意:這時只有在使用find等方法時纔會有緩存,而使用query查詢是沒有緩存的須要設置spa
.setHint(QueryHints.HINT_CACHEABLE, true);且每新建立一個query都要設置hibernate
測試二級緩存code
@Test public void testSecondCache() {//只有用到Manager的find方法時纔會使用到二級緩存,若想使query也用緩存,參考下一個方法 Teacher t = manager.find(Teacher.class, 1); System.out.println(t.getName()); transaction.commit(); manager.close(); manager = factory.createEntityManager(); transaction = manager.getTransaction(); transaction.begin(); Teacher t2 = manager.find(Teacher.class, 1); System.out.println(t2.getName()); }
JPQL查詢xml
1.createQuery()查詢blog
@Test public void testQuery2() { String jpql = "SELECT new Teacher(id,name) FROM Teacher t WHERE t.id > ?"; Query query = manager.createQuery(jpql); // 從1開始的 query.setParameter(1, 1); List list = query.getResultList(); System.out.println(list);// 若SELECT id,name ,那麼list中每一項是個數組;此時是Teacher }
2.createNamedQuery()查詢
@Test public void testNamedQuery() {// 使用命名查詢 Query query = manager.createNamedQuery("select"); query.setParameter(1, 1); Teacher t = (Teacher) query.getSingleResult(); System.out.println(t.getName()); }
Teacher類上要有@NamedQuery
@Cacheable(true) @NamedQuery(name = "select", query = "SELECT t FROM Teacher t WHERE t.id = 1")//雖然會報錯但也能夠寫FROM Teacher t WHERE t.id = ?上面測試方法用的就是這句 @Table(name = "TEACHER") @Entity public class Teacher {
3.createNativeQuery()查詢
@Test public void testNativeQuery() {// 表明使用本地數據庫支持的sql語句 Query query = manager.createNativeQuery("SELECT name FROM teacher WHERE TEACHER_ID = ?"); System.out.println(query.setParameter(1, 3).getSingleResult()); }
使用查詢緩存
若不使用查詢緩存,在使用query時,即便語句、條件都相同,那麼.getResultList();兩次也會發兩條sql。
@Test public void testTwoQuery() {//即便條件都相同也會發兩次sql String jpql = "FROM Teacher t WHERE t.id = ?"; Query query = manager.createQuery(jpql); query.setParameter(1, 1); List list = query.getResultList(); List list22 = query.getResultList(); }
使用查詢緩存了就只發一條
使用查詢緩存的方式(每次新create的query都要.setHint(QueryHints.HINT_CACHEABLE, true)):
@Test public void testQueryCache() { String jpql = "FROM Teacher t WHERE t.id = ?"; Query query = manager.createQuery(jpql).setHint(QueryHints.HINT_CACHEABLE, true); //兩次都必須加<property name="hibernate.cache.use_query_cache" value="true" /> query.setParameter(1, 1); List list = query.getResultList(); System.out.println(list.size()); query = manager.createQuery(jpql).setHint(QueryHints.HINT_CACHEABLE, true); //兩次都必須加<property name="hibernate.cache.use_query_cache" value="true" /> query.setParameter(1, 1); List list2 = query.getResultList(); System.out.println(list2.size()); }