Hibernate查询方式
-
对象导航查询
----根据id查询某个客户,再查询这个客户里面所有的联系人 -
OID查询
----根据id查询某一条记录,返回对象 -
HQL查询
----Query对象,写hql语句实现查询 -
QBC查询
----Criteria对象 -
本地sql查询
----SQLQuery对象,使用普通sql实现查询
1.对象导航查询
例:查询某个客户里面所有联系人(一对多)过程,使用对象导航实现
//根据cid=1客户,再查询客户中所有联系人
Customer customer = session.get(Customer.class,1);
//查询这个客户的所有联系人
//直接得到客户里联系人的set集合
Set<LinkMan> linkman = customer.getLinkMan();
2.OID查询
根据id查询记录----调用session里面的get方法实现
//根据cid=1客户,再查询客户中所有联系人
Customer customer = session.get(Customer.class,1);
3.HQL查询
- hql:hibernate query language,hibernate提供一种查询语言,hql语言和普通sql很相似,区别:普通sql操作数据库表和字段,hql操作实体类和属性
- 常用的hql语句
(1)查询所有: from 实体类名称
(2)条件查询: from 实体类名称 where 属性名称=?
(3)排序查询: from 实体类名称 order by 实体类属性名称 asc/desc - 使用hql查询操作时候,使用Query对象
(1)创建Query对象,写hql语句
(2)调用query对象里面的方法得到结果
3.1HQL查询所有
例:查询所有客户记录
(1)创建Query对象,写hql语句
(2)调用query对象里面的方法得到结果
//1 创建query对象
Query query = session.createQuery("from Customer");
//2 调用方法得到结果
List<Customer> list = query.list();
for (Customer customer : list) {
System.out.println(customer.getCid()+"::"+customer.getCustName());
}
3.2HQL常用查询
hql条件查询语句写法:
(1)from 实体类名称 where 实体类属性名称=? and实体类属性名称=?
(2)from 实体类名称 where 实体类属性名称 like ?
//-----条件查询--------
//1 创建query对象
//SELECT * FROM t_customer WHERE cid=? AND custName=?
Query query = session.createQuery("from Customer c where c.cid=? and c.custName=?");
//2 设置条件值
// 向?里面设置值
// setParameter方法两个参数
// 第一个参数:int类型是?位置,?位置从0开始
// 第二个参数:具体参数值
//设置第一个?值
query.setParameter(0, 1);
//设置第二个?值
query.setParameter(1, "百度");
//3 调用方法得到结果
List<Customer> list = query.list();
for (Customer customer : list) {
System.out.println(customer.getCid()+"::"+customer.getCustName());
}
//-------模糊查询------
//1 创建query对象
Query query = session.createQuery("from Customer c where c.custName like ?");
//2 设置?的值
// %浪%
query.setParameter(0, "%浪%");
//3 调用方法得到结果
List<Customer> list = query.list();
for (Customer customer : list) {
System.out.println(customer.getCid()+"::"+customer.getCustName());
}
//-----排序查询--------
//1 创建query对象
Query query = session.createQuery("from Customer order by cid desc");
//2 调用方法得到结果
List<Customer> list = query.list();
for (Customer customer : list) {
System.out.println(customer.getCid()+"::"+customer.getCustName());
}
//------分页查询------
//1 创建query对象
//写查询所有的语句
Query query = session.createQuery("from Customer");
//2 设置分页数据
//2.1 设置开始位置
query.setFirstResult(0);
//2.2 设置每页记录数
query.setMaxResults(3);
//3 调用方法得到结果
List<Customer> list = query.list();
for (Customer customer : list) {
System.out.println(customer.getCid()+"::"+customer.getCustName());
}
//投影查询
//1.投影查询:查询不是所有字段值,而是部分字段的值
//2 投影查询hql语句写法:
//(1)select 实体类属性名称1, 实体类属性名称2 from 实体类名称
//(2)select 后面不能写 * ,不支持的
//1 创建query对象
Query query = session.createQuery("select custName from Customer");
//2 调用方法得到结果
List<Object> list = query.list();
for (Object object : list) {
System.out.println(object);
}
//----聚集函数使用----
//常用函数count、sum、avg、max、min
//1 创建query对象
Query query = session.createQuery("select count(*) from Customer");
//2 调用方法得到结果
//query对象里面有方法,直接返回对象形式
Object obj = query.uniqueResult();
//返回int类型
// int count = (int) obj;
//首先把object变成long类型,再变成int类型
Long lobj = (Long) obj;
int count = lobj.intValue();
System.out.println(count);
4.QBC查询
- 使用hql查询需要写hql语句实现,但是使用qbc时候,不需要写语句了,使用方法实现
- 使用qbc时候,操作实体类和属性
- 使用qbc,使用Criteria对象实现
4.1QBC查询所有
(1)创建Criteria对象
(2)调用方法得到结果
//1 创建对象
Criteria criteria = session.createCriteria(Customer.class);
//2 调用方法得到结果
List<Customer> list = criteria.list();
4.2QBC常用查询
//-----条件查询------
//1 创建对象
Criteria criteria = session.createCriteria(Customer.class);
//2 使用Criteria对象里面的方法设置条件值
// 首先使用add方法,表示设置条件值
// 在add方法里面使用类的方法实现条件设置
// 类似于 cid=?
// criteria.add(Restrictions.eq("cid", 1));
// criteria.add(Restrictions.eq("custName", "百度"));
criteria.add(Restrictions.like("custName", "%百%"));
//3 调用方法得到结果
List<Customer> list = criteria.list();
//-----排序查询-----
//1 创建对象
Criteria criteria = session.createCriteria(Customer.class);
//2 设置对哪个属性进行排序,设置排序规则
criteria.addOrder(Order.desc("cid"));
//3 调用方法得到结果
List<Customer> list = criteria.list();
//-----分页查询-----
//1 创建对象
Criteria criteria = session.createCriteria(Customer.class);
//2 设置分页数据
//2.1 设置开始位置
criteria.setFirstResult(0);
//2.2 每页显示记录数
criteria.setMaxResults(3);
//3 调用方法得到结果
List<Customer> list = criteria.list();
//-----统计查询------
//1 创建对象
Criteria criteria = session.createCriteria(Customer.class);
//2 设置操作
criteria.setProjection(Projections.rowCount());
//3 调用方法得到结果
Object obj = criteria.uniqueResult();
Long lobj = (Long) obj;
int count = lobj.intValue();
//-----离线查询------
//1 servlet调用service,service调用dao
//(1)在dao里面对数据库crud操作
//(2)在dao里面使用hibernate框架,使用hibernate框架时候,调用session里面的方法实现功能
//1 创建对象
//Criteria criteria = session.createCriteria(Customer.class);
DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Customer.class);
//2 最终执行时候才需要到session
Criteria criteria = detachedCriteria.getExecutableCriteria(session);
List<Customer> list = criteria.list();