JPQL
1.是一种和SQL语句类似的中间性和对象化查询语句
2.在JPQL语句中都可以执行删除 查询 修改 的语句 都是通过Query接口来进行实现的

int executeUpdate();
      执行update 或者deleta 语句
    List getResultList();
 执行Select 语句并返回一个集合结果
    Object getSingleResult();
       执行查询语句返回一个对象
   int getMaxResults();
        返回结果实现中的最大的一个数
       Query setFirstResult(int var1);
           设置实体类开始返回的结果集
Query setHint(String var1, Object var2);
        对特定参数类进行编写对应的提示
Query setParameter(...)
   给对应的SPQL语句进行辅助上对应的参数

入门:
/**

     */
      @Before
     public   void  getVoidBuffer(){
           entityManagerFactory
                  = Persistence.createEntityManagerFactory("jpa-01");
           entityManager = entityManagerFactory.createEntityManager();
           transaction = entityManager.getTransaction();

          transaction.begin();

      }

     @After
     public   void  getVoidColse(){
         transaction.commit();
         entityManager.close();

         entityManagerFactory.close();
     }

    /**
     * 其他的查询的语句
     *     支持函数查询
     *     select  max(st.s_age) from  Student  st  where  st s_id = ?1
     *     两表查询
     *
     * select   st,o   from  Student  st ,Orders  o   where  o.r_id= ?1  or  st.s_id > ?2
     *
     * select  o  from    Student  st  inner  join  Orders  o   where   o.r_id= ?1  or  st.s_id > ?2
     * select  o  from    Student  st    join  Orders  o   where   o.r_id= ?1  or  st.s_id > ?2
     * select  o  from    Student  st   left   join  Orders  o   where   o.r_id= ?1  or  st.s_id > ?2
     */
    //对象数据类型
    @Test
    public   void  getVoidSel05(){
        //分页查询
        //query
        //List resultList = entityManager.createQuery("select  st   FROM   Student st")
        List   resultList = entityManager.createQuery("select  new Student(st.s_name,st.s_sex  ) FROM   Student st WHERE  st.s_age  >  ?1   and  st.s_sex = ?2 ")
                .setParameter(1,20)
                .setParameter(2,"男")


                .getResultList()
                ;

        System.out.println(resultList);
    }
    //返回非对象集合的
    @Test
    public   void  getVoidSel04(){
        //分页查询
        //query
        //List resultList = entityManager.createQuery("select  st   FROM   Student st")
        List   resultList = entityManager.createQuery("select  st.s_name,st.s_sex   FROM   Student st WHERE  st.s_age  >  ?1   and  st.s_sex = ?2 ")
                .setParameter(1,20)
                .setParameter(2,"男")


                .getResultList()
                ;

        System.out.println(resultList);
    }
    @Test
    public   void  getVoidSel03(){
        //分页查询
        //query
        //List resultList = entityManager.createQuery("select  st   FROM   Student st")
        List<Student> resultList = entityManager.createQuery("select  st   FROM   Student st WHERE  st.s_id  >  ?1  ")
                .setParameter(1,1)
                .setMaxResults(2)
                .getResultList()
                ;

        for (Student student : resultList) {
            System.out.println(student);
        }
    }
    @Test
    public   void  getVoidSel02(){
        //分页查询
        //query
        //List resultList = entityManager.createQuery("select  st   FROM   Student st")
        List<Student> resultList = entityManager.createQuery("select  st   FROM   Student st WHERE  st.s_name like  :names  ")
                .setParameter("names","%王%")
                .setMaxResults(2)
                .getResultList()
                ;

        for (Student student : resultList) {
            System.out.println(student);
        }
    }
    @Test
    public   void  getVoidSel01(){
        //分页查询
        //query
        //List resultList = entityManager.createQuery("select  st   FROM   Student st")
        List<Student> resultList = entityManager.createQuery("select  st   FROM   Student st WHERE  st.s_name like  ?1  ")
                .setParameter(1,"%王%")
                .setMaxResults(2)
                .getResultList()
              ;

        for (Student student : resultList) {
            System.out.println(student);
        }
    }
      /**
       查询
      */
       @Test
      public   void  getVoidSel(){
           //分页查询
            //query
           //List resultList = entityManager.createQuery("select  st   FROM   Student st")
           List<Student> resultList = entityManager.createQuery("select  st   FROM   Student st")
                   .setFirstResult(1)
                   .setMaxResults(2)
                   .getResultList();

           for (Student student : resultList) {
               System.out.println(student);
           }
       }


    /**
     添加
     */
    @Test
    public   void  getVoid(){
        Student student1 = new Student();
        student1.setS_name("王麻子");
        student1.setS_age(45);
        student1.setS_sex("男");
        entityManager.persist(student1);


    }

注解的方式进行查询
@NamedQuery(name = "queryStudent",query = "select st FROM Student st")
@Table(name = "JPA_STUDENT")
@Entity
public class Student {

/**

 */
private  Integer     s_id ;
private  Integer     s_age ;


/**

 */
private  String    s_name;
private  String    s_sex;
public Student() {

  /**
    注解的方式 进行查询
  */
   @Test
  public   void  getVoid01(){

       List queryStudent = entityManager.createNamedQuery("queryStudent")
               .setParameter(1, 1).getResultList();

       System.out.println(queryStudent);


   }
 -----------
 本地化的sql

/**
 注解的方式 进行查询
   本地化的sql
 */
@Test
public   void  getVoid02(){
    String  sql="select  p.s_name  from  JPA_STUDENT p where  p.s_id >  ? ";

    List queryStudent = entityManager.createNativeQuery(sql)
            .setParameter(1, 1).getResultList();

    System.out.println(queryStudent);


}

  /**
    注解的方式 进行查询
  */
   @Test
  public   void  getVoid01(){

       /**
        *实体类上必须要有
        *  /@NamedQuery(name = "queryStudent",query = "select  st   FROM   Student st  WHERE  st.s_age  >  ?1 ")
        */
       List queryStudent = entityManager.createNamedQuery("queryStudent")
               .setParameter(1, 1).getResultList();

       System.out.println(queryStudent);


   }
   -------------------------
   二级缓存
     配置
                 <property name="hibernate.cache.use_query_cache" value="true"/>
                 <property name="hibernate.cache.region.factory_class"   value="org.hibernate.cache.ehcache.EhCacheRegionFactory" />


     加载
         hibernate-release-5.0.7.Final\project\hibernate-ehcache\src\test\resources
       src目录下的ehcache.xml
    在实体类上加载
       @Cacheable //标识缓存  当前的实体类的
    在查询的query中加载设置
          .setHint(QueryHints.HINT_CACHEABLE,true) //支持是否二级缓存,  如不加 这咨询两sql语句