Hibernate 的多种查询方式 —— HQL 与 QBC
一、OID 查询
OID 查询是指根据对象 OID 主键进行检索
OID 查询方式:
- get(): 立即发出 SQL 语句,返回实际对象,查询不到时返回 null
- load(): 返回一个目标对象的代理对象,只存储了目标对象的 ID 值,当调用其他属性时才发出 SQL 语句,查询不到报错
二、对象导航检索
对象导航检索是指根据一个已查询到的对象,获得其关联对象
三、HQL(Hibernate Query Language)
hibernate 的查询语言,类似于 SQL, 但面向对象。采用 session.creatQuery(),注意不支持 * 的写法
1. 简单查询
```
Query query = session.createQuery("from User");
List<User> list = query.list();
```
2. 别名查询
```
Query query = session.createQuery("select c from User c");
List<User> list = query.list();
```
3. 排序查询
```
Query query = session.createQuery("select c from User c order by user_id desc");
List<User> list = query.list();
```
4. 条件查询
- 位置绑定,类似于 JDBC 现在不用了
- 名称绑定
Query query = session.createQuery("from User where user_code=:aaa and user_name=:bbb");
query.setParameter("aaa","11");
query.setParameter("bbb","user1");
List<User> list = query.list();
5. 投影查询
- 单个属性
List<Object> list = session.createQuery("select c.user_name from User c").list();
System.out.println(list);
- 多个属性
List<Object[]> list = session.createQuery("select c.user_name,c.user_code from User c").list();
for (Object[] objects : list) {
System.out.println(Arrays.toString(objects));
}
- 多个属性,封装到对象,需要提供构造器
List list = session.createQuery("select new User(user_code,user_name) from User").list();
System.out.println(list);
6. 分页查询
```
Query query = session.createQuery("from User");
// 位置从 0 开始数,包含 0
query.setFirstResult(0);
query.setMaxResults(2);
List list = query.list();
System.out.println(list);
```
7. 统计查询
- 统计
Object o = session.createQuery("select count(*) from User").uniqueResult();
System.out.println(o);
- 分组
List<Object[]> list = session.createQuery("select user_code,count(*) from User group by user_code").list();
for (Object[] objects : list) {
System.out.println(Arrays.toString(objects));
}
8. 多表查询
- 内连接:外键相等的部分取出来
- 左连接:左边表全部,右边只查外键相等部分
- 右连接:右边表全部,左边表只查外键相等部分
- 普通内连接
List<Object[]> list = session.createQuery("from User c inner join c.roles").list();
for (Object[] objects : list) {
System.out.println(Arrays.toString(objects));
}
- 迫切内连接
List<User> list = session.createQuery("from User c inner join fetch c.roles").list();
for (User user : list) {
System.out.println(user);
}
四、QBC(Query By Criteria)
QBC 主要用于条件查询,更加面向对象
1. 简单查询
```
List<User> list = session.createCriteria(User.class).list();
for (User user : list) {
System.out.println(user);
}
```
2. 排序查询
```
// 添加排序
criteria.addOrder(Order.asc("user_id"));
```
3. 分页查询
```
// 添加分页
criteria.setFirstResult(0);
criteria.setMaxResults(2);
```
4. 条件查询
- 条件
= eq
> gt
>= ge
< lt
<= le
<> ne
like
in
and
or - 单个条件
criteria.add(Restrictions.eq("user_name","user1"));
- 多个条件
criteria.add(Restrictions.eq("user_name","user1"));
criteria.like(Restrictions.eq("user_code","1%"));
- 统计查询
Criteria criteria = session.createCriteria(User.class);
// setProjection 设置一些聚合函数
Object o = criteria.setProjection(Projections.rowCount()).uniqueResult();
System.out.println(o);
- 离线条件查询,脱离Session,添加条件,可以在外部提前使用 DetachedCriteria 对象提交设置好条件,最后再绑定到 session 当中
DetachedCriteria detachedCriteria = DetachedCriteria.forClass(User.class);
// 设置条件
detachedCriteria.add(Restrictions.eq("user_name","user1"));
// 打开 session
Session session = HibernateUtil.openSession();
Criteria executableCriteria = detachedCriteria.getExecutableCriteria(session);
List list = executableCriteria.list();
System.out.println(list);