hibernate的五种查询方式

OID查询:

  get 方法调用时执行,返回实体类对象

  load 使用对象时执行,返回代理对象

SQL查询:

  SQLQuery ( 一般不用 )

  session的doWork方法可以拿到connection

HQL查询:

  使用HQL语句查询数据库

  把sql语句的表明换成了类名。把字段名换成实体类中的属性

QBC查询:

  使用Criteria对象查询

使用对象导航查询:

 

hibernate中的Query对象(着重) 

  它是hibernate中的HQL查询方式

  HQL:hibernate query language

  1.如何获取改对象:session的方法

  2.涉及的对象和方法:createQuery(String hql)

  3.方法的参数和含义:

    SQL:select cus_id  from customer

    HQL:select cusId from Customer

    HQL语句是把sql语句的表明换成了类名。把字段名换成实体类中的属性

hibernate中的Criteria对象(着重) 

  是QBC查询方式

  QBC:Query By Criteria

  获取对象的办法:session.create(Class clazz)

  涉及的方法:create(Class clazz)

  参数含义:要查询类的字节码

HQL查询:

  查询所有,条件查询,排序查询,分页查询,统计查询,投影查询

import com.utils.HibernateUtils;
import org.hibernate.Query;
import org.hibernate.Transaction;
import org.hibernate.classic.Session;
import org.junit.Test;

import java.util.List;

public class CustomerTestDemo06 {
    /**
     * HQL查询
     * 把sql语句的表明换成了类名。把字段名换成实体类中的属性
     */
    //查询所有
    @Test
    public void  test01(){
        Session s=HibernateUtils.getCurrnetSession();
        Transaction tx = s.beginTransaction();
        Query query=s.createQuery("from Customer");
        List list = query.list();
        for (Object o : list) {
            System.out.println((Customer)o);
        }
        tx.commit();
    }

    //按条件查询--1.占位符
    @Test
    public void  test02(){
        Session s=HibernateUtils.getCurrnetSession();
        Transaction tx = s.beginTransaction();
        Query query=s.createQuery("from Customer where lovel = ? or name like ?");
        query.setString(0,"做县官");  //占位符从0开始的
        query.setString(1,"%刘%");
        List list = query.list();
        for (Object o : list) {
            System.out.println((Customer)o);
        }
        tx.commit();
    }

    //按条件查询--2.给占位符取名字
    @Test
    public void  test03(){
        Session s=HibernateUtils.getCurrnetSession();
        Transaction tx = s.beginTransaction();
        //给参数区名 :名  规范是(:属性)
        Query query=s.createQuery("from Customer where lovel = :a or name like :name");
//        query.setString("a","做县官");  //占位符从0开始的
//        query.setString("name","%刘%");
        //setParameter()方法,此参数类型更灵活
        query.setParameter("a","做县官");
        query.setParameter("name","%刘%");
        List list = query.list();
        for (Object o : list) {
            System.out.println((Customer)o);
        }
        tx.commit();
    }

    //排序查询
    @Test
    public void  test04(){
        Session s=HibernateUtils.getCurrnetSession();
        Transaction tx = s.beginTransaction();
        //order by 列明 desc
        Query query=s.createQuery("from Customer  order by id desc ");
        List list = query.list();
        for (Object o : list) {
            System.out.println((Customer)o);
        }
        tx.commit();
    }

    /**
     * 分页查询,hibernate提供高了两个方法:
     * setFirstResult(),设置开始查询记录索引
     * setMaxResults(),设置每页查询条数
     *
     */
    @Test
    public void  test05(){
        Session s=HibernateUtils.getCurrnetSession();
        Transaction tx = s.beginTransaction();
        //order by 列明 desc
        Query query=s.createQuery("from Customer  order by id desc ");
        query.setFirstResult(3);
        query.setMaxResults(3);
        List list = query.list();
        for (Object o : list) {
            System.out.println((Customer)o);
        }
        tx.commit();
    }

    /**
     * 统计查询,使用聚合函数:
     *count sum avg max min
     */
    @Test
    public void  test06(){
        Session s=HibernateUtils.getCurrnetSession();
        Transaction tx = s.beginTransaction();
        //order by 列明 desc
        Query query=s.createQuery("select count(*) from Customer");
        /*List list = query.list();
        for (Object o : list) {
            System.out.println(o);
        }*/
        Object o = query.uniqueResult(); //当返回结果唯一的时候使用此方法
        System.out.println(o);
        tx.commit();
    }

    /**
     * 投影查询:
     * 查询结果只需要部分字段,不需要全部不,且希望返回的结果是封装类,而不是Object
     * 用法:用在HQL语句中new 一个对象,并给对象一哥具体的带参的构造函数
     */
    @Test
    public void  test07(){
        Session s=HibernateUtils.getCurrnetSession();
        Transaction tx = s.beginTransaction();
        //order by 列明 desc
        Query query=s.createQuery("select new com.bean.Customer(id,name) from Customer");
        List list = query.list();
        for (Object o : list) {
            System.out.println(o);
        }
        tx.commit();
    }
}

 

 QBC查询

  基本查询,条件查询,排序查询,分页查询,统计(投影)查询,离线查询。

 

package com.bean;

import com.utils.HibernateUtils;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Transaction;
import org.hibernate.classic.Session;
import org.hibernate.criterion.*;
import org.junit.Test;

import java.util.List;

public class CustomerTestDemo07 {
    /**
     * QBC查询
     * 更加面向对象的查询方式,它把生成语句的过程全都融入到方法之中
     * 效率比HQL查询慢
     */
    //基本查询
    @Test
    public void  test01(){
        Session s=HibernateUtils.getCurrnetSession();
        Transaction tx = s.beginTransaction();
        //获取Criteria对象
        Criteria criteria = s.createCriteria(Customer.class);
        List list = criteria.list();
        for (Object o : list) {
            System.out.println((Customer)o);
        }
        tx.commit();
    }

    //条件查询
    @Test
    public void  test02(){
        Session s=HibernateUtils.getCurrnetSession();
        Transaction tx = s.beginTransaction();
        //获取Criteria对象
        Criteria criteria = s.createCriteria(Customer.class);
        //添加查询条件
        criteria.add(Restrictions.eq("lovel", "做县官"));
        criteria.add(Restrictions.like("name", "%张%"));
        List list = criteria.list();
        for (Object o : list) {
            System.out.println((Customer)o);
        }
        tx.commit();
    }

    //分页查询
    @Test
    public void  test03(){
        Session s=HibernateUtils.getCurrnetSession();
        Transaction tx = s.beginTransaction();
        //获取Criteria对象
        Criteria criteria = s.createCriteria(Customer.class);
        //设置分页
        criteria.setFirstResult(0);//起始下标
        criteria.setMaxResults(2);  //每页显示条数
        List list = criteria.list();
        for (Object o : list) {
            System.out.println((Customer)o);
        }
        tx.commit();
    }

    //排序查询
    @Test
    public void  test04(){
        Session s=HibernateUtils.getCurrnetSession();
        Transaction tx = s.beginTransaction();
        //获取Criteria对象
        Criteria criteria = s.createCriteria(Customer.class);
        //添加查询条件
        criteria.addOrder(Order.desc("name"));
        List list = criteria.list();
        for (Object o : list) {
            System.out.println((Customer)o);
        }
        tx.commit();
    }

    //统计查询
    //使用sql自带的聚合函数
    @Test
    public void  test05(){
        Session s=HibernateUtils.getCurrnetSession();
        Transaction tx = s.beginTransaction();
        //获取Criteria对象
        Criteria criteria = s.createCriteria(Customer.class);
        //添加查询条件
        criteria.setProjection(Projections.count("id"));
        Object o = criteria.uniqueResult();
        System.out.println(o);
        tx.commit();
    }

    //离线查询
    //先用离线对象将查询条件封装,再交给session
    @Test
    public void test06(){
        //1.获取DetachedCriteria离线对象
        DetachedCriteria dc=DetachedCriteria.forClass(Customer.class);
        //2.封装查询条件
        dc.add(Restrictions.eq("lovel", "做县官"));
        dc.add(Restrictions.like("name", "%张%"));
        //3.获取session对象,开始事务
        Session s=HibernateUtils.getCurrnetSession();
        Transaction tx = s.beginTransaction();
        //4.将离线对象转成Criteria对象
        //Session s1=HibernateUtils.getCurrnetSession();
        Criteria criteria = dc.getExecutableCriteria(s);
        //5.执行查询
        List list = criteria.list();
        for (Object o : list) {
            System.out.println((Customer)o);
        }
        tx.commit();
    }





}

 

 

 

posted @ 2020-03-06 22:17  Jason–json  阅读(941)  评论(0编辑  收藏  举报