Hibernate框架查询方式

1. 唯一标识OID的检索方式
    * session.get(对象.class,OID)
2. 对象的导航的方式
public class Demo {

    /**
     * 演示对象导航的方式
     */
    @Test
    public void run1() {
        Session session = HibernateUtils.getCurrentSession();
        Transaction tx = session.beginTransaction();
        //先查询1号客户通过OID查询
        Customer customer = session.get(Customer.class, 1L);
        //查询该客户下联系人集合大小
        System.out.println(customer.getLinkmans().size());
        tx.commit();
    }

    /**
     * 查询联系人所属的客户
     */
    @Test
    public void run2() {
        Session session = HibernateUtils.getCurrentSession();
        Transaction tx = session.beginTransaction();
        //查询2号联系人通过OID查询
        Linkman linkman = session.get(Linkman.class, 2L);
        System.out.println(linkman.getCustomer().getCust_name());
        tx.commit();
    }
}
HQL方式的基本查询
/**
 * HQL方式的基本查询
 *
 * @author bamaw
 */
public class Demo2 {
    /**
     * 基本查询
     */
    @Test
    public void run1() {
        Session session = HibernateUtils.getCurrentSession();
        Transaction tx = session.beginTransaction();
        // 创建HQL的查询接口
        Query query = session.createQuery("from Customer");
        // 查询 //泛型写上,因为数据就封装进去了
        List<Customer> list = query.list();
        for (Customer customer : list) {
            System.out.println(customer);
        }
        tx.commit();
    }

    /**
     * 支持方法链编程 以及设置条件的查询
     */
    @Test
    public void run2() {
        Session session = HibernateUtils.getCurrentSession();
        Transaction tx = session.beginTransaction();
        // 创建HQL的查询接口
        /**
         * 如果设置条件
         * session.createQuery("from Customer").setParameter(index,参数).list()
         * index表示参数第几位(从0开始)
         * 如:session.createQuery("from User where id = ? and name = ?")
         * id就是第0位 name第一位
         */
        List<Customer> list = session.createQuery("from Customer").list();
        for (Customer customer : list) {
            System.out.println(customer);
        }
        tx.commit();
    }

    /**
     * 使用别名方式查询
     * 注意:如果在HQL语句中这样写
     * select * from Customer 语法错误 不能出现*号
     * 这样我们可以通过起别名的方式
     * 如:from Customer c
     *       select c from Customer c;
     *
     */
    @Test
    public void run3() {
        Session session = HibernateUtils.getCurrentSession();
        Transaction tx = session.beginTransaction();
        List<Customer> list = session.createQuery("select c from Customer c ").list();
        for (Customer customer : list) {
            System.out.println(customer);
        }
        tx.commit();
    }

    /**
     * 排序查询
     * SQL语句中  order by 字段  asc升序(默认)/desc降序
     * HQL语句中关键字是一样的
     */
    @Test
    public void run4() {
        Session session = HibernateUtils.getCurrentSession();
        Transaction tx = session.beginTransaction();
        //我给起了个别名 还可以from Customer order by cust_id desc
        List<Customer> list = session.createQuery("from Customer c order by c.cust_id desc").list();
        for (Customer customer : list) {
            System.out.println(customer);
        }
        tx.commit();
    }

    /**
     * 分页查询  mysql中 limit ?,?  ---第一个?号  (当前页-1)*pageSize
     *                                   第二个?号  pageSize
     * setFirstResult(0);     值 = (当前页-1)*pageSize
     * setMaxResults(2);    每页查询的最大条数
     */
    @Test
    public void run5() {
        Session session = HibernateUtils.getCurrentSession();
        Transaction tx = session.beginTransaction();
        Query query = session.createQuery("from Customer");
        query.setFirstResult(0);//从哪条记录开始,如果查询是从第一条开始,那么是0
        /**
         * 查询第二页query.setFirstResult(3);
         * 值 = (当前页-1)*pageSize
         */
        query.setMaxResults(3);//每页显示多少条
        List<Customer> list = query.list();
        //这里可以写成方法链的形式
        //List<Customer> list = session.createQuery("from Customer").setFirstResult(0).setMaxResults(3).list();
        for (Customer customer : list) {
            System.out.println(customer);
        }
        tx.commit();
    }

    /**
     * 按条件查询
     */
    @Test
    public void run6() {
        Session session = HibernateUtils.getCurrentSession();
        Transaction tx = session.beginTransaction();
        Query query = session.createQuery("from Customer where cust_id > ? and cust_level = ?");

        /**
         * 我们以前用过
         * Query query = session.createQuery("from Customer where cust_level = ?");
         * 传入值
         * query.setString(0,"高级");
         * 还有一种方式
         *  Query query = session.createQuery("from Customer where cust_level = :cust_level");
         *  query.setString("cust_level","高级");
         */

        /**
         * setParameter("?号的位置,默认从0开始","参数的值"); 不用考虑参数的具体类型
         * 按位置绑定参数的条件查询(指定下标值,默认从0开始)
         * 按名称绑定参数的条件查询(HQL语句中的 ? 号换成 :名称 的方式)
         */
        query.setParameter(0, 2L);
        query.setParameter(1, "高级");
        List<Customer> list = query.list();
        for (Customer customer : list) {
            System.out.println(customer);
        }
        tx.commit();
    }
}

投影查询

/**
     * 我不想查所有字段,只查指定的几个字段,
     * 那么这个查询结果出来不能封装到对象当中的,这个时候就采用投影去查询
     * 先演示为什么不能
     * 返回的是对象数组
     * 打印的结果
     * Hibernate:
     *    select
     *    customer0_.cust_name as col_0_0_,
     *    customer0_.cust_level as col_1_0_
     *    from
     *   cst_customer customer0_
     *    [bamaw, 高级]
     *    [巴莫, 初级]
     *    如果我就想把这些数据放到一个对象中,那么就new ,很麻烦
     *    那么如果我就想返回对象,我们可以采用投影查询,它支持我们返回一个对象
     */
    @Test
    public void run7() {
        Session session = HibernateUtils.getCurrentSession();
        Transaction tx = session.beginTransaction();
        Query query = session.createQuery("select cust_name,cust_level from Customer");
        List<Object[]> list = query.list();
        for (Object[] objects : list) {
            System.out.println(Arrays.toString(objects));
        }
        tx.commit();
    }

    /**
     * 投影查询 只查询个别属性  而不是全部
     * 1.在JavaBean对象中   提供对应的构造方法(注意:要写空构造奥!!!)
     * 2.在HQL语句中发生变化
     */
    @Test
    public void run8() {
        Session session = HibernateUtils.getCurrentSession();
        Transaction tx = session.beginTransaction();
        Query query = session.createQuery("select new Customer(cust_name , cust_level) from Customer");
        List<Customer> list = query.list();
        for (Customer customer : list) {
            System.out.println(customer);
        }
        tx.commit();
    }

    /**
     * 聚合函数 count() sum() avg() count() max() min()
     * 在count(*) 中可以写*
     */
    @Test
    public void run9() {
        Session session = HibernateUtils.getCurrentSession();
        Transaction tx = session.beginTransaction();
        /**
         * 查询客户数量
         * 我们查询过来得就是单列单行得数据并且是数值型
         * 我们并不是都的拿对象封装
         * 我们可以使用Number---Interger Long 的父类
         */
        List<Number> list = session.createQuery("select count(*) from Customer").list();
        /**
         * 假如在sql语句中不写*
         * 我们可以"select count(l) from Linkman l"
         * 就是给表起一个别名 然后将别名引入,这样也是可以的
         */
        //通过下标取值并转化为相应类型的值
        long count = list.get(0).longValue();
        System.out.println(count);
        tx.commit();
    }

    /**   * 获取某一列数据和
     * 聚合函数:求数量和  sum(x) 里面传的是有关数值的字段
     * 我表里面没有int类型  就拿cust_id算
     */
    @Test
    public void run10() {
        Session session = HibernateUtils.getCurrentSession();
        Transaction tx = session.beginTransaction();
        List<Number> list = session.createQuery("select sum(cust_id) from Customer").list();
        long sum = list.get(0).longValue();
        System.out.println(sum);
        tx.commit();
    }
    

QBC查询方式:

/**
 * QBC查询 按条件查询(推荐)
 * @author bamaw
 *
 */
public class Demo3 {

    //简单的查询
    @Test
    public void run1() {
        Session session = HibernateUtils.getCurrentSession();
        Transaction tx = session.beginTransaction();
        Criteria criteria = session.createCriteria(Customer.class);
        List<Customer> list = criteria.list();
        for (Customer customer : list) {
            System.out.println(customer);
        }
        tx.commit();
    }
    /**
     * QBC排序,调用方法
     */
    @Test
    public void run2() {
        Session session = HibernateUtils.getCurrentSession();
        Transaction tx = session.beginTransaction();
        Criteria criteria = session.createCriteria(Customer.class);
        //调用排序方法addOrder()
        criteria.addOrder(Order.desc("cust_id"));//降序
        List<Customer> list = criteria.list();
        for (Customer customer : list) {
            System.out.println(customer);
        }
        tx.commit();
    }

    /**
     * QBC分页 完全的面向对象
     */
    @Test
    public void run3() {
        Session session = HibernateUtils.getCurrentSession();
        Transaction tx = session.beginTransaction();
        Criteria criteria = session.createCriteria(Customer.class);
        criteria.setFirstResult(0);//(当前页-1)*pageSize
        criteria.setMaxResults(3);//pageSize
        List<Customer> list = criteria.list();
        for (Customer customer : list) {
            System.out.println(customer);
        }
        tx.commit();
    }

    /**
     * 条件查询(Criterion是查询条件的接口,Restrictions可不是criteria的实现类 ,而是
     * Restrictions类是Hibernate框架提供的工具类,使用该工具类来设置查询条件)
     * 条件查询使用Criteria接口的add方法,用来传入条件。
     * 使用Restrictions的添加条件的方法,来添加条件,例如:
     * Restrictions.eq           -- 相等
     * Restrictions.gt           -- 大于号
     * Restrictions.ge           -- 大于等于
     * Restrictions.lt           -- 小于
     * Restrictions.le           -- 小于等于
     * Restrictions.between      -- 在之间
     * Restrictions.like         -- 模糊查询
     * Restrictions.in           -- 范围
     * Restrictions.and          -- 并且
     * Restrictions.or           -- 或者
     */
    @Test
    public void run4() {
        Session session = HibernateUtils.getCurrentSession();
        Transaction tx = session.beginTransaction();
        Criteria criteria = session.createCriteria(Customer.class);
        criteria.add(Restrictions.eq("cust_level", "高级"));
        /**
         * 加入继续想加条件,可以继续在后面写
         * criteria.add(Restrictions.gt("cust_id", 1L));
         */
        List<Customer> list = criteria.list();
        for (Customer customer : list) {
            System.out.println(customer);
        }
        tx.commit();
    }

    /**
     * in查询
     */
    @Test
    public void run5() {
        Session session = HibernateUtils.getCurrentSession();
        Transaction tx = session.beginTransaction();
        Criteria criteria = session.createCriteria(Customer.class);
        //SQL:select * from cst_customer where cust_id in(1,2,6); 注意:::6不包含
        List<Long> params = new ArrayList<Long>();
        params.add(1L);
        params.add(2L);
        params.add(6L);
        //使用in查询
        criteria.add(Restrictions.in("cust_id", params));
        List<Customer> list = criteria.list();
        for (Customer customer : list) {
            System.out.println(customer);
        }
    }
}
    /**
     * or查询
     */
    @Test
    public void run6() {
        Session session = HibernateUtils.getCurrentSession();
        Transaction tx = session.beginTransaction();
        Criteria criteria = session.createCriteria(Customer.class);
        criteria.add(Restrictions.or(Restrictions.gt("cust_id", 1L), Restrictions.eq("cust_level", "初级")));
        List<Customer> list = criteria.list();
        for (Customer customer : list) {
            System.out.println(customer);
        }
        tx.commit();
    }

    /**
     * 判断某个字段为空的所有数据
     * Restrictions.isNull("cust_phone")
     */
    @Test
    public void run7() {
        Session session = HibernateUtils.getCurrentSession();
        Transaction tx = session.beginTransaction();
        Criteria criteria = session.createCriteria(Customer.class);
        //查看在cust_phone为空的数据
        criteria.add(Restrictions.isNull("cust_phone"));
        List<Customer> list = criteria.list();
        for (Customer customer : list) {
            System.out.println(customer);
        }
        tx.commit();
    }

    /**
     * QBC聚合函数的查询
     */
    @Test
    public void run8() {
        Session session = HibernateUtils.getCurrentSession();
        Transaction tx = session.beginTransaction();
        Criteria criteria = session.createCriteria(Customer.class);
        criteria.setProjection(Projections.count("cust_id"));
        List<Number> list = criteria.list();
        long count = list.get(0).longValue();
        System.out.println(count);
        tx.commit();
    }

    /**
     * 强调问题:聚合函数的查询
     * select count(lkm_id) from cst_linkman
     * 然后我们又想继续查select * from cst_linkman
     */
    @Test
    public void run9() {
        Session session = HibernateUtils.getCurrentSession();
        Transaction tx = session.beginTransaction();
        Criteria criteria = session.createCriteria(Customer.class);
        criteria.setProjection(Projections.count("cust_id"));
        List<Number> list = criteria.list();
        long value = list.get(0).longValue();
        System.out.println(value);

        //又想继续查select * from cst_linkman
        criteria.setProjection(null);
        List<Customer> list2 = criteria.list();
        for (Customer customer : list2) {
            System.out.println(customer);
        }
    }

    /**
     * 统计查询
     */
    @Test
    public void run10() {
        Session session = HibernateUtils.getCurrentSession();
        Transaction tx = session.beginTransaction();
        Criteria criteria = session.createCriteria(Customer.class);
        criteria.setProjection(Projections.rowCount());
        Long value = (Long) criteria.uniqueResult();
        System.out.println(value);
        tx.commit();
    }
public class Demo4 {

    /**
     *     QBC离线条件查询
     *  离线条件查询使用的是DetachedCriteria接口进行查询,
     *  离线条件查询对象在创建的时候,不需要使用Session对象,
     *  只是在查询的时候使用Session对象即可。
     */
    @Test
    public void run() {
        Session session = HibernateUtils.getCurrentSession();
        Transaction tx = session.beginTransaction();
        // 获得一个离线条件查询的对象
        DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Customer.class);
        detachedCriteria.add(Restrictions.eq("cust_level", "高级"));
        // 离线条件查询对象与session绑定.
        List<Customer> list = detachedCriteria.getExecutableCriteria(session).list();
        for (Customer customer : list) {
            System.out.println(customer);
        }
        tx.commit();
    }

    /**
     * 测试SQL语句的查询
     */
    @Test
    public void run2() {
        Session session = HibernateUtils.getCurrentSession();
        Transaction tx = session.beginTransaction();
        //创建SQL查询接口
        SQLQuery query = session.createSQLQuery("select * from cst_customer");
        List<Object[]> list = query.list();
        for (Object[] objects : list) {
            System.out.println(Arrays.toString(objects));
        }
    }

    /**
     * 如果要把数据封装到对象中
     * 怎么办??
     * 使用里面提供的方法
     */
    @Test
    public void run3() {
        Session session = HibernateUtils.getCurrentSession();
        Transaction tx = session.beginTransaction();
        //创建SQL查询接口
        SQLQuery query = session.createSQLQuery("select * from cst_customer");
        List<Customer> list = query.addEntity(Customer.class).list();
        for (Customer customer : list) {
            System.out.println(customer);
        }
    }
}
 
时间: 2024-10-06 22:52:46

Hibernate框架查询方式的相关文章

hibernate的查询方式

hibernate的查询方式常见的主要分为三种: HQL, QBC(Query By Criteria)查询, 以及使用原生SQL查询 HQL查询 • HQL(Hibernate Query Language)提供了丰富灵活的查询方式,使用HQL进行查询也是Hibernate官方推荐使用的查询方式. • HQL在语法结构上和SQL语句十分的相同,所以可以很快的上手进行使用.使用HQL需要用到Hibernate中的Query对象,该对象专门执行HQL方式的操作. 查询所有示例 session.be

Hibernate的查询方式(简要)

Hibernate的查询方式 1.OID检索: 使用session.get(Object.class,oid),session.load(Object.class,oid),根据表的主键查询 2.对象导航检索以及联级映射的配置: 根据已有对象查询与之对应的另外一些对象,比如一个Customer对象中有一个Linkmans(联系人对象)集合,当查询出Customer后,直接变量linkMans集合就可以查询到与之对应的联系人配置文件: 一对一:<one-to-one name="User&q

4、Hibernate的查询方式

一.Hibernate的查询方式:OID查询 1.OID检索:Hibernate根据对象的OID(主键)进行检索 1-1.使用get方法 Customer customer = session.get(Customer.class,1L); 1-2.使用load方法 Customer customer = session.load(Customer.class,1L); 3.对象导航检索:Hibernate根据一个已经查询到的对象,获得其关联的对象的一种查询方式. Customer custom

hibernate select 查询方式总结

1. 查询整个映射对象所有字段 Java代码 //直接from查询出来的是一个映射对象,即:查询整个映射对象所有字段 String hql = "from Users"; Query query = session.createQuery(hql); List<Users> users = query.list(); for(Users user : users){ System.out.println(user.getName() + " : " +

hibernate(七) hibernate中查询方式详解

序言 之前对hibernate中的查询总是搞混淆,不明白里面具体有哪些东西.就是因为缺少总结.在看这篇文章之前,你应该知道的是数据库的一些查询操作,多表查询等,如果不明白,可以先去看一下 MySQL数据表查询操作详解  ,以至于看这篇文章不用那么吃力. --WH 一.hibernate中的5种检索方式 1.1.导航对象图检索方式 根据已经加载的对象导航到其他对象 例如:在前面的各种映射关系中,实体类包含对其他类对象的引用. Dept d = (Dept) session.get(Dept.cla

Hibernate学习(七)———— hibernate中查询方式详解

序言 之前对hibernate中的查询总是搞混淆,不明白里面具体有哪些东西.就是因为缺少总结.在看这篇文章之前,你应该知道的是数据库的一些查询操作,多表查询等 --WH 一.hibernate中的5种检索方式 1.1.导航对象图检索方式 根据已经加载的对象导航到其他对象 例如:在前面的各种映射关系中,实体类包含对其他类对象的引用. Dept d = (Dept) session.get(Dept.class,2); d.getStaffSet().size(); //d对象关联Staff集合,h

Hibernate主要查询方式

1.hql查询 1.1 无参数的hql查询 1.2 带参的hql查询(分为问号占位和字符占位两种) Ps: 绑定各种类型的参数时用setParameter()绑定参数,如封装方法后用不定参数时循环绑定参数:也可以使用setProperties()动态绑定,但是不如criteria查询 2.特殊hql查询方法 2.1 uniqueResult()查询唯一结果 需要注意的是,当查询结果不唯一时,会报NonUniqueResultException的错,谨慎使用该方法 2.2 分页查询 2.3 投影查

Hibernate查询方式 一

Hibernate查询方式 说到hibernate的查询方式,我们自然而然就想到了它--hql,hibernate query language.hql是使用hibernate框架的变成配朋友们使用最多的一种方式,它以自身的独特的优势:屏蔽数据库,书写灵活的优点,备受大家的青睐.但是Hibernate不仅给我们提供了这一种查询方式,这时候悠然要说来,是不只一种,还有sql,对,确实还有sql,但是还有一种,就是Criteria 查询.那么今天,我们就来聊一聊hibernate的几种查询方式. H

hibernate的三种查询方式

hibernate的查询方式常见的主要分为三种: HQL, QBC, 以及使用原生SQL查询(Session的查询) 1)Query的查询:使用HQL语句或SQL语句完成查询 2)Criteria的查询:通过方法和类中属性的关系,来设置查询条件,完成查询. 3)Session的查询:按主键查询查询,方法为get或load 一.HQL查询 ? HQL(Hibernate Query Language)提供了丰富灵活的查询方式,使用HQL进行查询也是Hibernate官方推荐使用的查询方式. ? H