jpa-query

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());
    }
相關文章
相關標籤/搜索