hibernate入门(四)——QBC查询(Criteria)

标准化对象查询(Query By Criteria):以对象的方式进行查询,将查询语句封装为对象操作。可读性好,符合java程序员的编程习惯。

hibernate5.X 版本中 session.createCriteria() 已经过时。
javax.persistence.criteria.CriteriaQuery 取代。

环境配置等详细内容请看:hibernate入门(一)——基本环境搭建

在包orm.test下创建类 CriteriaTest.java

1.导入的包:

package orm.test;

import java.util.List;

import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Order;
import javax.persistence.criteria.Root;
import javax.persistence.criteria.Subquery;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.junit.Test;

import orm.entity.User;
import orm.util.HibernateUtil;

2.详细代码:

public class CriteriaTest {
    @Test // 简单查询
    public void criteriaTest() {
        SessionFactory sessionFactory = null;
        Session session = null;
        Transaction transaction = null;

        try {
            sessionFactory = HibernateUtil.getSessionFactory();
            session = sessionFactory.getCurrentSession();
            transaction = session.beginTransaction();
            // 获取  CriteriaBuilder
            CriteriaBuilder criteriaBuilder = session.getCriteriaBuilder();
            // 创建  CriteriaQuery
            CriteriaQuery<User> criteria = criteriaBuilder.createQuery(User.class);
            criteria.from(User.class);
            List<User> list = session.createQuery(criteria).getResultList();
            for (User user : list) {
                System.out.println(user);
            }
            transaction.commit();
        } catch (HibernateException e) {
            if (transaction != null) {
                transaction.rollback();
            }
            e.printStackTrace();
        }
    }

    @Test // 属性查询
    public void queryByTest() {
        SessionFactory sessionFactory = null;
        Session session = null;
        Transaction transaction = null;

        try {
            sessionFactory = HibernateUtil.getSessionFactory();
            session = sessionFactory.getCurrentSession();
            transaction = session.beginTransaction();
            CriteriaBuilder criteriaBuilder = session.getCriteriaBuilder();
            CriteriaQuery<User> criteria = criteriaBuilder.createQuery(User.class);
            Root<User> from = criteria.from(User.class);
            //user表中age为26的记录
            criteria.select(from).where(from.get("age").in("26"));
            List<User> list = session.createQuery(criteria).getResultList();
            for (User user : list) {
                System.out.println(user);
            }
            transaction.commit();
        } catch (HibernateException e) {
            if (transaction != null) {
                transaction.rollback();
            }
            e.printStackTrace();
        }
    }

    @Test // orderBy查询
    public void orderByTest() {
        SessionFactory sessionFactory = null;
        Session session = null;
        Transaction transaction = null;

        try {
            sessionFactory = HibernateUtil.getSessionFactory();
            session = sessionFactory.getCurrentSession();
            transaction = session.beginTransaction();
            CriteriaBuilder criteriaBuilder = session.getCriteriaBuilder();
            CriteriaQuery<User> criteria = criteriaBuilder.createQuery(User.class);
            Root<User> from = criteria.from(User.class);
            //查询结果按id降序排列
            Order order = criteriaBuilder.desc(from.get("id"));
            criteria.orderBy(order);
            List<User> list = session.createQuery(criteria).getResultList();
            for (User user : list) {
                System.out.println(user);
            }
            transaction.commit();
        } catch (HibernateException e) {
            if (transaction != null) {
                transaction.rollback();
            }
            e.printStackTrace();
        }
    }

    @Test // 统计查询
    public void countTest() {
        SessionFactory sessionFactory = null;
        Session session = null;
        Transaction transaction = null;

        try {
            sessionFactory = HibernateUtil.getSessionFactory();
            session = sessionFactory.getCurrentSession();
            transaction = session.beginTransaction();
            CriteriaBuilder criteriaBuilder = session.getCriteriaBuilder();
            CriteriaQuery<Long> criteria = criteriaBuilder.createQuery(Long.class);
            Root<User> from = criteria.from(User.class);
            //user表中记录总数
            criteria.select(criteriaBuilder.count(from));
            Long count = session.createQuery(criteria).uniqueResult();
            System.out.println("总数为:"+count);
            transaction.commit();
        } catch (HibernateException e) {
            if (transaction != null) {
                transaction.rollback();
            }
            e.printStackTrace();
        }
    }

    @Test // 子查询
    public void subQueryTest() {
        SessionFactory sessionFactory = null;
        Session session = null;
        Transaction transaction = null;

        try {
            sessionFactory = HibernateUtil.getSessionFactory();
            session = sessionFactory.getCurrentSession();
            transaction = session.beginTransaction();
            CriteriaBuilder criteriaBuilder = session.getCriteriaBuilder();
            // 创建criteria
            CriteriaQuery<User> criteria = criteriaBuilder.createQuery(User.class);
            Root<User> from = criteria.from(User.class);
            // 创建子查询
            Subquery<Double> subQuery = criteria.subquery(Double.class);
            Root<User> subFrom = subQuery.from(User.class);
            // user表中age的平均值
            subQuery.select(criteriaBuilder.avg(subFrom.get("age")));
            // user表中age大于平均值的记录
            criteria.select(from).where(criteriaBuilder.gt(from.get("age"), subQuery));
            List<User> list = session.createQuery(criteria).getResultList();
            for (User user : list) {
                System.out.println(user);
            }
            transaction.commit();
        } catch (HibernateException e) {
            if (transaction != null) {
                transaction.rollback();
            }
            e.printStackTrace();
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_35224639/article/details/80611540
今日推荐