hibernate----HQL查询

我们先来写一个工具类:

package com.itheima.utils;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;

//完成Hibernate工具类
//封装配置文件读取操作
//封装Sessionfactroy创建操作
//封装session获得操作
public class HibernateUtils {
	private static SessionFactory sf;	
	static{
		//1加载配置
		Configuration  conf = new Configuration().configure();
		//2 根据Configuration 配置信息创建 SessionFactory
		sf = conf.buildSessionFactory();
		//
		Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
			
			@Override
			public void run() {
				System.out.println("关闭!释放资源");
				sf.close();
			}
		}));
		
	}
	public static org.hibernate.Session  openSession(){
				
				//3 获得session
				Session session = sf.openSession();
				
				return session;
	}
	public static org.hibernate.Session  getCurrentSession(){
		//3 获得session
		Session session = sf.getCurrentSession();
		
		return session;
}	
	public static void main(String[] args) {
		System.out.println(openSession());
	}
}

查询所有客户

@Test

   public void demo01(){

      //1 查询所有

      Session session = factory.openSession();

      session.beginTransaction();

     

      //1  使用简单类名 , 存在自动导包

      // * Customer.hbm.xml <hibernate-mapping auto-import="true">

//    Query query = session.createQuery("from Customer");

      //2 使用全限定类名

      Query query = session.createQuery("from com.itheima.a_init.Customer");

     

      List<Customer> allCustomer = query.list();

      for (Customer customer : allCustomer) {

          System.out.println(customer);

      }

     

      session.getTransaction().commit();

      session.close();

   }

 

选择查询

@Test

   public void demo02(){

      //2 简单条件查询

      Session session = factory.openSession();

      session.beginTransaction();

     

     

      //1 指定数据,cid OID名称

//    Query query = session.createQuery("from Customer where cid = 1");

      //2 如果使用id,也可以(了解)

//    Query query = session.createQuery("from Customer where id = 1");

      //3 对象别名 ,格式: 类 [as] 别名

//    Query query = session.createQuery("from Customer as c where c.cid = 1");

      //4 查询所有项,mysql--> select * from...

      Query query = session.createQuery("select c from Customer as c where c.cid = 1");

     

      Customer customer = (Customer) query.uniqueResult();

      System.out.println(customer);

     

      session.getTransaction().commit();

      session.close();

   }
    1. 投影查询(部分)

      @Test
      
         public void demo04(){
      
            //4 投影
      
            Session session = factory.openSession();
      
            session.beginTransaction();
      
           
      
            //1 默认
      
            //如果单列 ,select c.cname from,需要List<Object>
      
            //如果多列,select c.cid,c.cname from ,需要List<Object[]>  ,list存放每行,Object[]多列
      
      //    Query query = session.createQuery("select c.cid,c.cname from Customer c");
      
            //2 将查询部分数据,设置Customer对象中
      
            // * 格式:new Customer(c.cid,c.cname)
      
            // * 注意:Customer必须提供相应的构造方法。
      
            // * 如果投影使用oid,结果脱管态对象。
      
            Query query = session.createQuery("select new Customer(c.cid,c.cname) from Customer c");
      
           
      
            List<Customer> allCustomer = query.list();
      
            for (Customer customer : allCustomer) {
      
                System.out.println(customer.getCid() + " : " + customer.getOrderSet().size());
      
            }
      
           
      
            session.getTransaction().commit();
      
            session.close();
      
         }

 

排序

@Test

   public void demo03(){

      //3排序 ,mysql--> select... order by 字段  [asc]|desc ,....

      Session session = factory.openSession();

      session.beginTransaction();

     

      Query query = session.createQuery("from Customer order by cid desc");

     

      List<Customer> allCustomer = query.list();

      for (Customer customer : allCustomer) {

          System.out.println(customer.getCid());

      }

     

      session.getTransaction().commit();

      session.close();

   }
    1. 分页

      @Test
      
         public void demo05(){
      
            //分页
      
            Session session = factory.openSession();
      
            session.beginTransaction();
      
           
      
            Query query = session.createQuery("from Customer");
      
            // * 开始索引 , startIndex 算法: startIndex = (pageNum - 1) * pageSize;
      
            // *** pageNum 当前页(之前的 pageCode)
      
            query.setFirstResult(0);
      
            // * 每页显示个数 , pageSize
      
            query.setMaxResults(2);
      
           
      
            List<Customer> allCustomer = query.list();
      
            for (Customer customer : allCustomer) {
      
                System.out.println(customer.getCid());
      
            }
      
           
      
            session.getTransaction().commit();
      
            session.close();
      
         }

      绑定参数

      @Test
      
         public void demo06(){
      
            /* 6 绑定参数
      
             * 方式1:占位符,使用? 在hql语句替换具体参数
      
             *     设置参数 query.setXxx(int , object)
      
             *        参数1:?位置,从0开始。
      
             *        参数2:实际参数
      
             *     例如:String --> query.setString(int,String)
      
             * 方式2:别名 , 格式 “属性= :别名 ”
      
             *     设置参数 query.setXxx(String,object)
      
             *        参数1:别名
      
             *        参数2:实际参数
      
             *     例如:Integer --> query.setInteger(String,Integer)
      
             * 提供公共设置方法
      
             * setParameter(int|string , Object)
      
             */
      
            Session session = factory.openSession();
      
            session.beginTransaction();
      
           
      
            Integer cid = 1;
      
           
      
            //方式1
      
      //    Query query = session.createQuery("from Customer where cid = ?");
      
      //    query.setInteger(0, cid);
      
            //方式2
      
            Query query = session.createQuery("from Customer where cid = :xxx");
      
      //    query.setInteger("xxx", cid);
      
            query.setParameter("xxx", cid);
      
           
      
            Customer customer = (Customer) query.uniqueResult();
      
            System.out.println(customer);
      
           
      
            session.getTransaction().commit();
      
            session.close();
      
         }

 

聚合函数和分组

@Test

   public void demo07(){

      /* 7  聚合函数

       */

      Session session = factory.openSession();

      session.beginTransaction();

     

      //1

//    Query query = session.createQuery("select count(*) from Customer");

      //2 别名

//    Query query = session.createQuery("select count(c) from Customer c");

      //3 oid

      Query query = session.createQuery("select count(cid) from Customer");

     

      Long numLong = (Long) query.uniqueResult();

      int num = numLong.intValue();

     

      System.out.println(num);

     

     

      session.getTransaction().commit();

      session.close();

   }

 

    1. 连接查询

1.交叉连接 ,等效 sql 笛卡尔积

2.隐式内连接,等效 sql 隐式内连接

3.内连接,等效sql内连接

4.迫切内连接,hibernate底层使用 内连接。

5.左外连接,等效sql左外连接

6.迫切左外连接,hibernate底层使用 左外连接

7.右外连接,等效sql右外连接

 

内连接和迫切内连接?

左外连接和迫切左外连接?

@Test

   public void demo08(){

      /* 8 链接查询 : 左外连接和迫切左外连接?

       * * 左外连接 , left outer join

       *     底层使用sql的左外连接,hibernate进行数据自动封装,将一条记录,封装给两个对象(Customer,Order)

       *     将两个对象添加到一个对象数组中Object[Customer,Order]

       * * 迫切左外链接 left outer join fetch

       *     底层使用sql的左外连接,hibernate将一条记录封装给Customer,讲order数据封装Order,并将order关联到Customer

       *        customer.getOrderSet().add(order)

       *     默认查询的数据重复

       */

      Session session = factory.openSession();

      session.beginTransaction();

     

      //左外连接

//    List list = session.createQuery("from Customer c left outer join c.orderSet ").list();

      //迫切左外链接 (默认数据重复)

//    List list = session.createQuery("from Customer c left outer join fetch c.orderSet ").list();

      //迫切左外链接 (去重复)

      List list = session.createQuery("select distinct c from Customer c left outer join fetch c.orderSet ").list();

     

     

      session.getTransaction().commit();

      session.close();

   }

 

    1. 命名查询
  1. 思想:将HQL从java源码中,提取到配置文件中。
  2. 分类:全局、布局
  3. 配置

       全局:*.hbm.xml   <class></class><query name="名称">HQL语句

             

       局部: <class name="" table=""><id><property> <query name="">HQL</class>

             

  1. 获得

       全局:

              session.getNamedQuery("queryName")

       局部:

              session.getNamedQuery("className.queryName")  需要使用类的全限定名称

 

@Test

   public void demo09(){

      /* 9 命名查询

       */

      Session session = factory.openSession();

      session.beginTransaction();

     

      //全局

      //List list = session.getNamedQuery("findAll").list();

      //局部

      List list = session.getNamedQuery("com.itheima.a_init.Customer.findAll").list();

     

      System.out.println(list.size());

     

      session.getTransaction().commit();

      session.close();

   }

猜你喜欢

转载自blog.csdn.net/qq_40674583/article/details/82025084
今日推荐