OID 查询是指根据对象 OID 主键进行检索

  • get(): 立即发出 SQL 语句,返回实际对象,查询不到时返回 null
  • load(): 返回一个目标对象的代理对象,只存储了目标对象的 ID 值,当调用其他属性时才发出 SQL 语句,查询不到报错

对象导航检索是指根据一个已查询到的对象,获得其关联对象

hibernate 的查询语言,类似于 SQL, 但面向对象。采用 session.creatQuery(),注意不支持 * 的写法

  1. ```
  2. Query query = session.createQuery("from User");
  3. List<User> list = query.list();
  4. ```
  1. ```
  2. Query query = session.createQuery("select c from User c");
  3. List<User> list = query.list();
  4. ```
  1. ```
  2. Query query = session.createQuery("select c from User c order by user_id desc");
  3. List<User> list = query.list();
  4. ```
  • 位置绑定,类似于 JDBC 现在不用了
  • 名称绑定
    1. Query query = session.createQuery("from User where user_code=:aaa and user_name=:bbb");
    2. query.setParameter("aaa","11");
    3. query.setParameter("bbb","user1");
    4. List<User> list = query.list();
  • 单个属性
    1. List<Object> list = session.createQuery("select c.user_name from User c").list();
    2. System.out.println(list);
  • 多个属性
    1. List<Object[]> list = session.createQuery("select c.user_name,c.user_code from User c").list();
    2. for (Object[] objects : list) {
    3. System.out.println(Arrays.toString(objects));
    4. }
  • 多个属性,封装到对象,需要提供构造器
    1. List list = session.createQuery("select new User(user_code,user_name) from User").list();
    2. System.out.println(list);
  1. ```
  2. Query query = session.createQuery("from User");
  3. // 位置从 0 开始数,包含 0
  4. query.setFirstResult(0);
  5. query.setMaxResults(2);
  6. List list = query.list();
  7. System.out.println(list);
  8. ```
  • 统计
    1. Object o = session.createQuery("select count(*) from User").uniqueResult();
    2. System.out.println(o);
  • 分组
    1. List<Object[]> list = session.createQuery("select user_code,count(*) from User group by user_code").list();
    2. for (Object[] objects : list) {
    3. System.out.println(Arrays.toString(objects));
    4. }
  • 内连接:外键相等的部分取出来
  • 左连接:左边表全部,右边只查外键相等部分
  • 右连接:右边表全部,左边表只查外键相等部分
  • 普通内连接
    1. List<Object[]> list = session.createQuery("from User c inner join c.roles").list();
    2. for (Object[] objects : list) {
    3. System.out.println(Arrays.toString(objects));
    4. }
  • 迫切内连接
    1. List<User> list = session.createQuery("from User c inner join fetch c.roles").list();
    2. for (User user : list) {
    3. System.out.println(user);
    4. }

QBC 主要用于条件查询,更加面向对象

  1. ```
  2. List<User> list = session.createCriteria(User.class).list();
  3. for (User user : list) {
  4. System.out.println(user);
  5. }
  6. ```
  1. ```
  2. // 添加排序
  3. criteria.addOrder(Order.asc("user_id"));
  4. ```
  1. ```
  2. // 添加分页
  3. criteria.setFirstResult(0);
  4. criteria.setMaxResults(2);
  5. ```
  • 条件

    = eq
    > gt
    >= ge
    < lt
    <= le
    <> ne
    like
    in
    and
    or

  • 单个条件
    1. criteria.add(Restrictions.eq("user_name","user1"));
  • 多个条件
    1. criteria.add(Restrictions.eq("user_name","user1"));
    2. criteria.like(Restrictions.eq("user_code","1%"));
  • 统计查询
    1. Criteria criteria = session.createCriteria(User.class);
    2. // setProjection 设置一些聚合函数
    3. Object o = criteria.setProjection(Projections.rowCount()).uniqueResult();
    4. System.out.println(o);
  • 离线条件查询,脱离Session,添加条件,可以在外部提前使用 DetachedCriteria 对象提交设置好条件,最后再绑定到 session 当中
    1. DetachedCriteria detachedCriteria = DetachedCriteria.forClass(User.class);
    2. // 设置条件
    3. detachedCriteria.add(Restrictions.eq("user_name","user1"));
    4. // 打开 session
    5. Session session = HibernateUtil.openSession();
    6. Criteria executableCriteria = detachedCriteria.getExecutableCriteria(session);
    7. List list = executableCriteria.list();
    8. System.out.println(list);

版权声明:本文为mdz3201原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/mdz3201/p/HQL_QBC.html