jpa-query

Hibernate中set参数是从0开始,jpa中set参数是从1开始

二级缓存的使用(目的是可以跨EntityManager使用,而一级缓存只在一个EntityManager)

  1.加入hibernate的lib/optional/ehcache中的全部,再导projectetc中的ehcache.xml配置文件

  2.在persistence.xml中配置二级缓存

    3.在需要被二级缓存的实体类上加@Cacheable(true)

  注意:这时只有在使用find等方法时才会有缓存,而使用query查询是没有缓存的需要设置

    .setHint(QueryHints.HINT_CACHEABLE, true);且每新创建一个query都要设置

    测试二级缓存

    @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查询

  1.createQuery()查询

    @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());
    }

 

原文地址:https://www.cnblogs.com/feifeiyun/p/6927903.html