Hibernate01 - 入门概念 搭建环境 api
Hibernate02 - 缓存 一对多 多对多:
Hibernate03 -查询方式 OID hql QBC
Hibernate查询方式
-
对象导航查询
根据id查询某个客户,再查询这个客户里面所有的联系人
-
OID查询
根据id查询某一条记录,返回对象
-
HQL查询
Query对象,写hql语句实现查询
-
QBC查询
Criteria对象
-
本地sql查询
SQLQuery对象,使用普通sql实现查询
对象导航查询
查询某个客户里面所有联系人过程,使用对象导航实现
代码:
// 根据cid=1客户 在查询这个客户所有的联系人
Customer customer = session.get(Customer.class, 1);
// 在查询这个客户所有的联系人
// 直接得到客户里面联系人的set集合
Set<LinkMan> linkManSet = customer.getLinkManSet();
System.out.println(linkManSet.size());
OID查询
根据id查询记录 可以根据session中get方法查询
Customer customer = session.get(Customer.class, 1);
HQL查询
Query对象,写hql语句实现查询
hql: hibernate query language 和普通的sql很相似
区别:
- 普通sql操作的是数据库的表和表的字段
- hql操作的是实体类和属性
Query对象:
- 创建Query对象 ,写hql
- 调用Query对象里面的方法 得到结果
常见的HQL语句
查询所有
// 创建query对象 (from 实体类名)
Query query = session.createQuery("from Customer");
// 调用方法得到结果
List<Customer> list = query.list();
for (Customer customer : list) {
System.out.println(customer.getCid() +":"+customer.getCustName());
}
条件查询
from 实体类名称 where 实体类属性=?and 实体类属性=?
from 实体类名称 where 实体类属性 like ?模糊查询
代码:
注意: 新版本现在的占位符?后面要带上索引位置 新的jpa格式
// 创建query对象
// Query query = session.createQuery("from Customer where cid=? and custName=?");
// 起别名
Query query2 = session.createQuery("from Customer c where c.cid=?1 and c.custName=?2");
// 设置条件值
// setParameter方法中有两个参数
// 第一个参数: int类型是?位置 从0开始
// 第二个参数: ?位置的值
query2.setParameter(1,1);
query2.setParameter(2,"baidu");
// 调用方法得到结果
List<Customer> list = query2.list();
for (Customer customer : list) {
System.out.println(customer.getCid() + ":" + customer.getCustName());
}
排序查询
代码 降序desc 升序默认/asc
// 创建query对象
Query query = session.createQuery("from Customer order by cid desc");
List<Customer> list = query.list();
for (Customer customer : list) {
System.out.println(customer);
}
分页查询
1 mysql实现分页
使用关键字 limit实现
2 在hql中实现分页
在hql操作中,在语句里面不能写limit,hibernate的Query对象封装两个方法实现分页操作
代码
// 创建query对象
// 写查询的操作
Query query = session.createQuery("from Customer ");
// 设置分页数据
// 设置开始位置
query.setFirstResult(0);
// 每页记录数
query.setMaxResults(2);
List<Customer> list = query.list();
for (Customer customer : list) {
System.out.println(customer);
}
投影查询
什么是投影查询?
查询部分属性(字段)的值…
语法
select 实体类属性1,实体类属性2 from 实体类名称
注:select 后面不能写* 不支持的
代码实现
// 创建query对象
// 写查询的操作
Query query = session.createQuery("select custName from Customer ");
List<Object> list = query.list();
for (Object o : list) {
System.out.println(o);
}
// 多个字段
// 写查询的操作
Query query = session.createQuery("select custName,cid from Customer ");
List<Object[]> list = query.list();
for (Object[] o : list) {
System.out.println(o[0]+o[1]);
}
聚集函数使用
常用的聚集函数
count、sum、avg、max、min
// 创建query对象
// 写查询的操作
Query query = session.createQuery("select count(*) from Customer ");
// 调用方法得到结果
// query对象里面有方法,直接返回对象形式(object)
// 本身返回的的long类型
Long o = (Long) query.uniqueResult();
// 使用Integer类型来接收
Integer i = o.intValue();
System.out.println(i);
HQL多表查询
内连接查询(两个表有联系)
mysql
select * from t_customer c,t_linkeman l where c.cid = l.cid;
select * from t_customer c inner join t_linkman l on c.cid = l.cid
hql
// 实体类 属性
from Customer c inner join c.linkManSet
// 返回的是数组
迫切内连接
from Customer c inner join fetch c.linkManSet
// 返回的是Customer
迫切内连接和内连接区别:
迫切内连接返回的list每部分是对象
内连接返回的list每部分是数组
左外连接(全部显示)
mysql
select * from t_customer c left outer join t_linkman l on c.cid = l.cid
hql
==
// 实体类 属性
from Customer c left outer join c.linkManSet
// 返回的是数组
迫切左外连接
from Customer c left outer join fetch c.linkManSet
// 返回的是Customer
右外连接(全部显示)
mysql
select * from t_customer c right outer join t_linkman l on c.cid = l.cid
hql
from Customer c right outer join c.linkManSet
QBC查询
- 使用hql查询需要写hql语句实现,但是使用qbc的时候 不需要写语句了,使用方法实现。
- 使用qbc时候,操作实体类和属性
- 使用qbc,使用Criteria对象实现
查询所有
// 创建Criteria对象
Criteria criteria = session.createCriteria(Customer.class);
List<Customer> list = criteria.list();
for (Customer customer : list) {
System.out.println(customer);
}
条件查询
// 创建Criteria对象
Criteria criteria = session.createCriteria(Customer.class);
// 使用Criteria里面的方法设置条件值
// add方法 设置条件值
criteria.add(Restrictions.eq("cid",1));
criteria.add(Restrictions.eq("custName","baidu"));
List<Customer> list = criteria.list();
for (Customer customer : list) {
System.out.println(customer);
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QShzvJ1M-1597224319457)(…/AppData/Roaming/Typora/typora-user-images/image-
顺序查询
// 创建Criteria对象
Criteria criteria = session.createCriteria(Customer.class);
// 设置对那个属性进行排序,设置排序规则
// criteria.addOrder(Order.asc("cid"));
criteria.addOrder(Order.desc("cid"));
List<Customer> list = criteria.list();
for (Customer customer : list) {
System.out.println(customer);
}
分页查询
// 创建Criteria对象
Criteria criteria = session.createCriteria(Customer.class);
// 设置分页开始位置 每页记录数
criteria.setFirstResult(0);
criteria.setMaxResults(2);
统计查询(count)
// 设置操作
criteria.setProjection(Projections.rowCount());
// 调用方法 得到最后的结果
Object o = criteria.uniqueResult();
Long l = (Long) o;
Integer i = l.intValue();
System.out.println(i);
sion.createCriteria(Customer.class);
// 设置分页开始位置 每页记录数
criteria.setFirstResult(0);
criteria.setMaxResults(2);
统计查询(count)
// 设置操作
criteria.setProjection(Projections.rowCount());
// 调用方法 得到最后的结果
Object o = criteria.uniqueResult();
Long l = (Long) o;
Integer i = l.intValue();
System.out.println(i);
Hibernate01 - 入门概念 搭建环境 api
Hibernate02 - 缓存 一对多 多对多:
Hibernate03 -查询方式 OID hql QBC