Hibernate中的QBC查询方式详解

本文详细介绍了Hibernate中的QBC(Query By Criteria)查询方式,这是一种面向对象的查询手段。内容包括QBC的简单查询、排序查询、分页查询、条件查询、统计分组查询以及离线条件查询——DetachedCriteria的使用,强调了DetachedCriteria在Web层设置查询条件的优势。
Hibernate中的QBC查询方式详解

QBC:Query By Criteria,条件查询。

是一种更加面向对象化的查询的方式。


1、QBC简单查询

测试代码:

package com.pipi.hibernate05;

import com.pipi.hibernate04.Dept;
import myutils.HibernateUtil;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.Transaction;

import java.util.List;

// QBC简单查询:查询表中所有记录
public class Test01_QBC {
    public static void main(String[] args) {

        Session session = HibernateUtil.getCurrentSession();
        Transaction transaction = session.beginTransaction();

        // 简单查询
        Criteria criteria = session.createCriteria(Dept.class);
        List<Dept> list = criteria.list();

        for (Dept d : list) {
            System.out.println(d);
        }

        transaction.commit();
    }
}

(2)QBC排序查询

测试代码:

package com.pipi.hibernate05;

import com.pipi.hibernate04.Dept;
import myutils.HibernateUtil;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Order;

import java.util.List;

// QBC排序查询
public class Test02_QBC {
    public static void main(String[] args) {

        Session session = HibernateUtil.getCurrentSession();
        Transaction transaction = session.beginTransaction();

        // 排序查询
        Criteria criteria = session.createCriteria(Dept.class);
        //criteria.addOrder(Order.asc("deptno"));  // 升序
        criteria.addOrder(Order.desc("deptno"));  // 降序
        List<Dept> list = criteria.list();

        for (Dept d : list) {
            System.out.println(d);
        }

        transaction.commit();
    }
}

(3)QBC分页查询

测试代码:

package com.pipi.hibernate05;

import com.pipi.hibernate04.Emp;
import myutils.HibernateUtil;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.Transaction;

import java.util.List;

// QBC的分页查询
public class Test03_QBC {
    public static void main(String[] args) {

        Session session = HibernateUtil.getCurrentSession();
        Transaction transaction = session.beginTransaction();

        // 分页查询
        Criteria criteria = session.createCriteria(Emp.class);
        criteria.setFirstResult(0);
        criteria.setMaxResults(5);
        List<Emp> list = criteria.list();

        for (Emp e : list) {
            System.out.println(e);
        }

        transaction.commit();
    }
}

(4)QBC条件查询

测试代码:

package com.pipi.hibernate05;

import com.pipi.hibernate04.Emp;
import myutils.HibernateUtil;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Restrictions;

import java.util.List;
/*
    criteria.add(Restrictions.xxx())
        =   eq
        >   gt
        >=  ge
        <   lt
        <=  le
        <>  ne
        like
        in
        and
        or
        between
 */
// QBC的条件查询
public class Test04_QBC {
    public static void main(String[] args) {

        Session session = HibernateUtil.getCurrentSession();
        Transaction transaction = session.beginTransaction();

        // 条件查询
        Criteria criteria = session.createCriteria(Emp.class);
        criteria.add(Restrictions.like("ename", "Smi%"));
        //criteria.add(Restrictions.or(Restrictions.eq("job", "Clerk")));
        criteria.add(Restrictions.eq("job", "Clerk"));
        List<Emp> list = criteria.list();

        for (Emp e : list) {
            System.out.println(e);
        }

        transaction.commit();
    }
}

(5)QBC统计分组查询

测试代码:

package com.pipi.hibernate05;

import com.pipi.hibernate04.Emp;
import myutils.HibernateUtil;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Projections;

// QBC的统计分组查询
public class Test05_QBC {
    public static void main(String[] args) {

        Session session = HibernateUtil.getCurrentSession();
        Transaction transaction = session.beginTransaction();

        Criteria criteria = session.createCriteria(Emp.class);
        /*
            add           : 普通的条件,where后面的条件
            addOrder      : 排序
            setProjection : 聚合函数 和 group by having
         */
        criteria.setProjection(Projections.rowCount());
        Long cnt = (Long) criteria.uniqueResult();

        System.out.println(cnt);  // 14

        transaction.commit();
    }
}

(6)QBC离线条件查询:DetachedCriteria

什么是QBC离线查询?

往往在Web层时,就可以设置QBC语句,及查询条件。
但在Web层是没有Session对象的,Session是Dao层的。
此时可以使用离线查询DetachedCriteria对象。

测试代码:

package com.pipi.hibernate05;

import com.pipi.hibernate04.Emp;
import myutils.HibernateUtil;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Restrictions;

import java.util.List;

// QBC离线条件查询:DetachedCriteria
public class Test06_QBC {
    public static void main(String[] args) {

        // 在创建Session对象之前,就可以创建DetachedCriteria,并设置条件
        DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Emp.class);
        detachedCriteria.add(Restrictions.eq("ename", "Smith"));

        // 创建Session对象
        Session session = HibernateUtil.getCurrentSession();
        Transaction transaction = session.beginTransaction();

        // 将DetachedCriteria对象与Session绑定,返回Criteria对象
        Criteria criteria = detachedCriteria.getExecutableCriteria(session);

        List<Emp> list = criteria.list();
        for (Emp e : list) {
            System.out.println(e);
        }

        transaction.commit();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值