hibernate学习笔记(三)hibernate批量查询的三种方式——HQL、Criteria、原生SQL

作者:叁念

在写入教程之前,现在之前的表中插入一些数据,脚本如下:

DROP TABLE IF EXISTS `cst_customer`;
CREATE TABLE `cst_customer`  (
  `cust_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '客户编号(主键)',
  `cust_name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '客户名称(公司名称)',
  `cust_source` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '客户信息来源',
  `cust_industry` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '客户所属行业',
  `cust_level` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '客户级别',
  `cust_linkman` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '联系人',
  `cust_phone` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '固定电话',
  `cust_mobile` varchar(16) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '移动电话',
  PRIMARY KEY (`cust_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

INSERT INTO `cst_customer` VALUES (1, '阿里', '', NULL, '', '', '', '');
INSERT INTO `cst_customer` VALUES (2, '百度', '', NULL, '', '', '', '');
INSERT INTO `cst_customer` VALUES (3, '腾讯', NULL, NULL, NULL, NULL, NULL, NULL);
INSERT INTO `cst_customer` VALUES (4, '叁念', NULL, NULL, NULL, NULL, NULL, NULL);

一、HQL查询 (hibernate Query Language)

1.1 什么是hql?
  • Hibernate独家查询语言,属于面向对象的查询语言
  • 多表查询,在不复杂时使用
1.2 如何使用hql?
1.2.1 基本查询
        Configuration configure = new Configuration().configure("hibernate.cfg.xml");
        SessionFactory sessionFactory = configure.buildSessionFactory();
        Session session = sessionFactory.getCurrentSession();
        //开启事务
        Transaction transaction = session.beginTransaction();
        /** hql案例一 查列表*/
        String hql = "from com.sannian.bean.Customer";//如果你能保证这个类名在项目中是独一无二的,也可以书写为简单类名,如:Customer
        Query query = session.createQuery(hql);
        List<Customer> list = query.list();
        /** hql案例二 查对象*/
        String hql1 = "from com.sannian.bean.Customer where cust_id = 1";
        Query query1 = session.createQuery(hql1);
        Customer customer = (Customer) query1.uniqueResult();
        //事务提交
        transaction.commit();
1.2.2 条件查询

普通方式查询:

                String hql = "from Customer where cust_id = 1";
                Query query = session.createQuery(hql);
                List list = query.list();

匿名占位符查询:

                String hql = "from Customer where cust_id = ?";
                /**
注意:如果你的hibernate版本比较高的话会报如下错误:
Caused by: org.hibernate.QueryException: 
Legacy-style query parameters (`?`) are no longer supported; use JPA-style ordinal parameters (e.g., `?1`) instead
解决办法:将HQL语句中的"?"改为JPA-style:
如:String hql = "from Customer where cust_id = ?0";
                */
                Query query = session.createQuery(hql);
                // 设置参数
                query.setParameter(0, 2l);
                // query.setLong(0, 2l);
                List list = query.list();

命名占位符查询:

                String hql = "from Customer where cust_id = :cust_id";
                Query query = session.createQuery(hql);
                // 设置参数
                query.setParameter("cust_id", 3l);
                // query.setLong(0, 2l);
                List list = query.list();

分页查询:

                String hql = "from Customer";
                Query query = session.createQuery(hql);
                // 设置分页 显示前两个
                query.setFirstResult(0);//从第0个开始
                query.setMaxResults(2);//显示2个结果
                List<Customer> list = query.list();

二、Criteria查询(单表条件查询)

2.1 什么是Criteria查询
  • Hibernate自创的无语句面向对象查询
2.2 如何使用Criteria查询
2.2.1 基本查询:
                // 查询所有的客户
                Criteria criteria = session.createCriteria(Customer.class);
                List<Customer> list = criteria.list();
2.2.2 条件查询:
                // 查询id为3的客户
                Criteria criteria = session.createCriteria(Customer.class);
                criteria.add(Restrictions.eq("cust_id", 3l));
        //      List<Customer> list = criteria.list();
                Customer c = (Customer) criteria.uniqueResult();
2.2.3 分页查询:
                // 查询所有的客户
                Criteria criteria = session.createCriteria(Customer.class);
                //分页,显式1到3
                criteria.setFirstResult(1);
                criteria.setMaxResults(3);
                List<Customer> list = criteria.list();
2.2.1 设置查询总记录数:
                //查询所有的客户
                Criteria criteria = session.createCriteria(Customer.class);
                //设置聚合函数
                criteria.setProjection(Projections.rowCount());
                Long result = (Long) criteria.uniqueResult();

三、原生SQL查询(复杂的业务查询)

3.1 如何使用
3.1.1 基本查询:

返回数组List:

                String sql = "SELECT * FROM cst_customer";
                SQLQuery query = session.createSQLQuery(sql);
                List<Object[]> list = query.list();

返回对象List

                String sql = "SELECT * FROM cst_customer";
                SQLQuery query = session.createSQLQuery(sql);
                query.addEntity(Customer.class);
                List<Customer> list = query.list();
3.1.2 条件查询:
                String sql = "SELECT * FROM cst_customer where cust_id = ?";
                SQLQuery query = session.createSQLQuery(sql);
                query.addEntity(Customer.class);
                query.setLong(0, 3l);
                Object result = query.uniqueResult();
3.1.3 分页查询:
                String sql = "SELECT * FROM cst_customer limit ?,?";
                SQLQuery query = session.createSQLQuery(sql);
                query.addEntity(Customer.class);

                query.setInteger(0, 0);
                query.setInteger(1, 2);

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

转义字符表:

                     *  条件查询
                     *  >                   gt
                     *  >=                  ge
                     *  <                   lt
                     *  <=                  le
                     *  ==                  eq
                     *  !=                  ne
                     *  in                  in
                     *  bewteen and         bewteen
                     *  like                like
                     *  is not null         isNotNull
                     *  is null             isNull
                     *  or                  or
                     *  and                 and

猜你喜欢

转载自blog.csdn.net/qq_36868342/article/details/80649215
今日推荐