zoukankan      html  css  js  c++  java
  • 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());
        }

     

  • 相关阅读:
    Windows Server 2008 定时任务卡住了不执行
    Oracle正则表达式取得所有非匹配的查询结果
    Websphere6.1.x不打印Log4j日志问题解决办法
    js的parseInt函数结果为0很奇怪的问题
    ORA12514: TNS:listener does not currently know of service问题原因
    Windows Server 2003升级IE6到高版本系统不支持解决方法
    Windows Server 2008 定时任务卡住了不执行
    Oracle正则表达式取得所有非匹配的查询结果
    Websphere6.1.x不打印Log4j日志问题解决办法
    Hibernate保存数据自动生成主键出现奇怪异常Duplicate entry '0' for key 1
  • 原文地址:https://www.cnblogs.com/feifeiyun/p/6927903.html
Copyright © 2011-2022 走看看