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);
    

猜你喜欢

转载自www.cnblogs.com/mdz3201/p/HQL_QBC.html