在写入教程之前,现在之前的表中插入一些数据,脚本如下:
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