zoukankan      html  css  js  c++  java
  • 【Hibernate】检索方式

    一、概述

    • 检索方式:查询的方式
    • 导航对象图检索方式: 根据已经加载的对象导航到其他对象
      • Customer customer = (Customer)session.get(Customer.class,1);
      • customer.getOrders();// 获得到客户的订单
    • OID 检索方式: 按照对象的 OID 来检索对象
      • get()/load();方法进行检索.
    • HQL 检索方式: 使用面向对象的 HQL 查询语言
      • Query query = session.createQuery(“HQL”);
    • QBC 检索方式: 使用 QBC(Query By Criteria) API 来检索对象. 这种 API 封装了基于字符串形式的查询语句, 提供了更加面向对象的查询接口.
      • Criteria criteria = session.createCriteria(Customer.class);
    • 本地 SQL 检索方式: 使用本地数据库的 SQL 查询语句
      • SQLQuery query = session.createSQLQuery(“SQL”);

    二、HQL

    2.1 简介

    • HQL:Hibernate Query Language
    • 特点:
      • 面向对象的查询
      • 支持方法链编程
    • 使用:
      • 创建Query接口

    2.2 查询所有记录

    List<Customer> list = session.createQuery("from Customer").list();
    for (Customer customer : list) {
        System.out.println(customer);
    }
    

    2.3 查询使用别名

    // 使用别名
    // 别名as可以省略
    /*  List<Customer> list =
      session.createQuery("from Customer  c").list();
      System.out.println(list);*/
     
        
    // 使用别名:带参数
    /*List<Customer> list = session
            .createQuery("from Customer as c where c.cname = ?")
            .setString(0, "小沈").list();
    System.out.println(list);*/
        
    // 不支持 select * from Customer写法.可以写成 select 别名 from Customer as 别名;
    List<Customer> list = session.createQuery("select c from Customer c").list();
    System.out.println(list);
    

    2.4 排序

    List<Customer> list = session.createQuery(
            "from Customer c order by c.id desc").list();
    for (Customer customer : list) {
        System.out.println(customer);
    }
    

    2.5 分页查询

    Query query = session.createQuery("from Order");
    query.setFirstResult(20);
    query.setMaxResults(10);
    List<Order> list = query.list();
    for (Order order : list) {
        System.out.println(order);
    }  
    

    2.6 单个对象查询

    Customer customer = (Customer) session
            .createQuery("from Customer where cname = ?")
            .setString(0, "小明").uniqueResult();
    System.out.println(customer);
    

    2.7 参数绑定

    // 1.使用?号方式绑定
    /*Query query = session.createQuery("from Customer where cname = ?");
    query.setString(0, "小沈");
    List<Customer> list = query.list();
    System.out.println(list);*/
        
    /*Query query = session.createQuery("from Customer where cname = ? and cid =?");
    query.setString(0, "小沈");
    query.setInteger(1,3);
    List<Customer> list = query.list();
    System.out.println(list);*/
        
    // 2.使用名称的方式绑定
    Query query = session.createQuery("from Customer 
             where cname=:name and cid=:id");
    query.setString("name", "小沈");
    query.setInteger("id", 3);
    List<Customer> list = query.list();
    System.out.println(list);
        
    // 3.绑定实体
    List<Order> list = session
        .createQuery("from Order o where o.customer = ?")
        .setEntity(0, customer).list();
    for (Order order : list) {
        System.out.println(order);
    }
    

    2.8 投影操作

    // 查询客户的名称:
     List<Object> list = session.createQuery(
             "select c.cname from Customer c").list(); System.out.println(list);
     
      
     List<Object[]> list = session.createQuery(
            "select c.cid,c.cname from Customer c").list(); 
    for (Object[] objects : list){ 
        System.out.println(Arrays.toString(objects)); 
    }
     
        
    List<Customer> list = session.createQuery(
            "select new Customer(cname) from Customer").list();
    System.out.println(list);
    

    2.9 模糊查询

    Query query = session.createQuery("
                from Customer where cname like ?");
    query.setParameter(0, "小%");
    List<Customer> list = query.list();
    System.out.println(list);
    

    2.10 SQL多表查询

    • 连接:
    • 交叉连接:
      • select * from A,B;
    • 内连接:查询的是两个表的交集!
      • select * from A inner join B on A.字段 = B.字段;
    • 隐式内连接:
      • select * from A,B where A.字段 = B.字段;
    • 外连接:
    • 左外连接:
      • select * from A left outer join B on A.字段 = B.字段;
    • 右外连接:
      • select * from A right outer join B on A.字段 = B.字段;

    2.11 HQL多表的查询

    • 连接:
    • 交叉连接:
    • 内连接:
    • 隐式内连接:
    • 迫切内连接:
    • 左外连接:
    • 迫切左外连接:
    • 右外连接:
    • HQL的内连接和迫切内连接区别:
    • 内连接查询 :将数据封装一个List中.
    • 迫切内连接 :将数据封装一个List中.但是迫切内连接,得到会有重复记录 ,需要使用distinct排重.

    三、QBC

    3.1 简介

    3.2 查询所有记录

    List<Customer> list =session.createCriteria(Customer.class).list();
    for (Customer customer : list) {
        System.out.println(customer);
    }
    

    3.3 排序

    List<Customer> list = session.createCriteria(Customer.class)
            .addOrder(org.hibernate.criterion.Order.desc("id")).list();
    for (Customer customer : list) {
        System.out.println(customer);
    }
    

    3.4分页

    Criteria criteria = session.createCriteria(Order.class);
    criteria.setFirstResult(10);
    criteria.setMaxResults(10);
    List<Order> list = criteria.list();
    for (Order order : list) {
        System.out.println(order);
    }
    

    3.5获取单个对象

    Customer customer = (Customer) session.createCriteria(Customer.class)
            .add(Restrictions.eq("cname", "小明")).uniqueResult();
    System.out.println(customer);
    

    3.6 带参数的查询

    /*
      List<Customer> list = session.createCriteria(Customer.class)
         .add(Restrictions.eq("cname", "小明")).list();
      System.out.println(list);
     */
        
    List<Customer> list = session.createCriteria(Customer.class)
            .add(Restrictions.eq("cname", "小明"))
            .add(Restrictions.eq("cid", 2)).list();
    System.out.println(list);
    

    3.7 模糊查询

    Criteria criteria = session.createCriteria(Customer.class);
    criteria.add(Restrictions.like("cname", "大%"));
    List<Customer> list = criteria.list();
    System.out.println(list);
    
    

    四、SQL

    4.1 简介

    4.2 SQL语句查询所有记录

    List<Object[]> list = session.createSQLQuery("select * from 
                customer").list();
    for (Object[] objects : list) {
        System.out.println(Arrays.toString(objects));
    }
        
    List<Customer> list = session.createSQLQuery("select * from     
            customer").addEntity(Customer.class).list();
    for (Customer customer : list) {
        System.out.println(customer);
    }
                
    
  • 相关阅读:
    记录一下守护进程的管理命令
    发布自己的第一版asp.net core的RESTful接口程序
    自己写一个chrome扩展程序
    DynamicJson-好用dotnet4的json对象
    Java提高——多线程(三)同步、锁
    Java提高——多线程(二)join、sleep、yield
    Java提高——多线程(一)状态图
    Git小结
    一个扎心的错——Consider defining a bean of type 'java.lang.String' in your configuration.
    关于mybatis对实体类参数绑定参数的问题
  • 原文地址:https://www.cnblogs.com/haoworld/p/hibernate-jian-suo-fang-shi.html
Copyright © 2011-2022 走看看