Hibernate 查询数据

Hibernate 检索方式

  • 类级别检索:当前对象所有属性值。例如:Customer自己数据
  • 关联级别检索:当前对象关联对象数据。例如:Customer 关联 Order 数据

1 检索概述

  • 通过OID检索
    get() 立即查询,如果没有返回nullload() 默认延迟检查,如果没有结果抛异常。
    使用以上两个方法进行查询,结果都为持久态对象,持久对象就在一级缓存中。
  • 对象导航图 : 通过持久对象自动获得关联对象。
    例如:customer.getOrderSet().size()

  • 原始SQL语句

    session.createSQLQuery("sql语句") ,理论进行优化,提供性能。建议不用。
  • QBC ,hibernate 提供 纯面向对象查询语句,Query By Criteria,弱化。

  • HQL ,hibernate 提供面向对象查询语句。类似SQL语句(重点)

       HQL 使用对象和对象属性,SQL语句使用表名和字段名称。
        对象和属性区分大小写的。表名和字段名称不区分大小写。

1 类级别

类级别:查询当前类的所有内容,只查询一次。优化指的是查询时机优化,让空闲时间服务器做出其他处理。

    session.get(Customer.class ,oid) 通过OID立即检索(查询),如果数据不存在返回null。
    session.load(Customer.class , oid ) 默认通过OID延迟检索,如果数据不存在将抛异常。

1 Hibernate 加载配制文件 获取session


public class H3Utils {

    //提供一个工厂 (链式操作)
    private static SessionFactory factory = 
        new Configuration()
    .configure("android/longs/study/config/hibernate.cfg.xml")
    .buildSessionFactory();

    /**
     * 获得线程绑定的session
     * @return
     */
    public static Session getCurrentSession(){
    return factory.getCurrentSession();
    }

}

1 查询所有

//HQL 方式
public void queryAllFunction1(){
    Session session = H3Utils.getCurrentSession();
    session.beginTransaction();
    //HQL
    Query query = session.createQuery("from Customer");
    //获取
    List<Customer> allCustomer = query.list();

    session.getTransaction().commit();
    session.close();
}
//HQL 方式

public void queryAllFunction2(){
    Session session = H3Utils.getCurrentSession();
    session.beginTransaction();
    //HQL  可以使用别名 , 这里的别名为 c ,可以使用别名来代替 select 中的 * 
    Query query = session.createQuery("select c from Customer as c");
    //获取
    List<Customer> allCustomer = query.list();

    session.getTransaction().commit();
    session.close();

}
//sql 语句方式
public void queryAllFunction3(){
    Session session = factory.openSession();
    session.beginTransaction();
    //2 SQL
    SQLQuery sqlQuery = session.createSQLQuery("select * from t_customer");
    // * 必须设置查询结果封装到那个对象中
    sqlQuery.addEntity(Customer.class);
    //获取数据 
    List<Customer> allCustomer = sqlQuery.list();

    session.getTransaction().commit();
    session.close();
}
 //QBC方式 
public void queryAllFunction4(){
    Session session = H3Utils.getCurrentSession();
    session.beginTransaction();
    //QBC
    Criteria criteria = session.createCriteria(Customer.class);
    //获取数据
    List<Customer> allCustomer = criteria.list();

    session.getTransaction().commit();
    session.close();
}


2 通过 id 来查询单个数据

  • hql 方式根据指定id来查询


public void queryCuseromeFromIdToHQL(int id) {
    Session session = H3Utils.getCurrentSession();
    session.beginTransaction();
    //创建 hql
    Customer customer =(Customer) session.createQuery("from Customer c where c.cid = 1").uniqueResult();

    session.getTransaction().commit();
    session.close();
}
  • sql方式根据指定id来查询

public void queryCuseromeFromIdToSQL(int id) {
    Session session = H3Utils.getCurrentSession();
    session.beginTransaction();
    //构建sql 
    String sql = "select * from t_customer c where c.cid= "+id;
    //通过 sql 来查询对应的数据 
    Customer customer = 
        (Customer) session
        .createSQLQuery(sql)//执行sql
        .addEntity(Customer.class)//封装数据的实体类型
        .uniqueResult();//获取一个对象

    session.getTransaction().commit();
    session.close();
}
  • QBC方式根据指定id来查询

public void queryCuseromeFromIdToQBC(int id) {
    Session session = H3Utils.getCurrentSession();
    session.beginTransaction();
    //QBC 
    Customer customer = 
        (Customer) session
        .createCriteria(Customer.class)
        .add(Restrictions.eq("cid", 1)) //添加约束
        .uniqueResult();

    session.getTransaction().commit();
    session.close();
}


3 排序查询

  • hql 方式查询排序

public void queryAllDescFunctonForHQL(){
    Session session = H3Utils.getCurrentSession();
    session.beginTransaction();
    //构建HQL语句
    String hql = "from Customer c order by c.cid desc";
    // 1 hql , 格式:  order by 属性名  [asc]|desc
    List<Customer> allCustomer = 
        session.createQuery(hql).list();

    session.getTransaction().commit();
}    
  • sql方式查询排序

public void queryAllDescFunctonForSql(){
    Session session = H3Utils.getCurrentSession();
    session.beginTransaction();
    //构建sql 语句 
    String sql = "select * from t_customer order by cid desc";
    // 2 sql 
    List<Customer> allCustomer = 
        session.createSQLQuery(sql)
        .addEntity(Customer.class)
        .list();

    session.getTransaction().commit();

}
  • QBC方式方式查询排序

 public void queryAllDescFunctonForQBC(){
    Session session = H3Utils.getCurrentSession();
    session.beginTransaction();
    // 3 qbc 注意Order
    List<Customer> allCustomer =
        session.createCriteria(Customer.class)
        .addOrder(org.hibernate.criterion.Order.desc("cid"))
        .list();

    session.getTransaction().commit();

}


4 查询部分内容

  • hql 方式查询部分内容
//通过hql方式来查询 部分内容 
public void queryPartForHql() {
    Session session = H3Utils.getCurrentSession();
    session.beginTransaction();
    //构建语句 
    String hql = "select new Customer(cid,name) from Customer";
    /*
     * hql  查询,默认将查询结果封装到 Object[] 中,但我们需要封装指定对象中
     * 可以 提供构造方法,将查询结果通过构造方法直接创建对象。
     * 投影查询,查询结果为脱管态
     * 注意对应的类 Customer 中要有对应的 构造
     */

    List<Customer> allCustomer = session.createQuery(hql).list();

    session.getTransaction().commit();
    session.close();
} 
  • sql方式查询部分内容

//通过SQL方式来查询 部分内容 
public void queryPartForSql() {
    Session session = H3Utils.getCurrentSession();
    session.beginTransaction();
    //构建语句
    String sql = "select cid,name from t_customer";
    //查询 
    List<Customer> allCustomer = session.createSQLQuery(sql).addEntity(Customer.class).list();

    session.getTransaction().commit();

}
  • QBC方式查询部分内容

//通过QBC方式来查询 部分内容 
public void queryPartForQBC() {
    Session session = H3Utils.getCurrentSession();
    session.beginTransaction();

    List<Customer> allCustomer = 
        session.createCriteria(Customer.class)//设置数据封装的类
        .setProjection(
            Projections.projectionList()
            .add(Projections.alias(Projections.property("cid"), "cid"))//添加 查询的部分
            .add(Projections.alias(Projections.property("name"), "name"))//添加 查询的部分
            )
            .setResultTransformer( new AliasToBeanResultTransformer(Customer.class))
            .list();

    session.getTransaction().commit();
}


5 分页查询

  • hql 方式分页查询
 //通过 HQL 分页查询 
public  void queryPageHql() {
    Session session = H3Utils.getCurrentSession();
    session.beginTransaction();

    //1 hql , 不能手动设置limit
    List<Customer> allCustomer = session.createQuery("from Customer")
        .setFirstResult(0)//查询的页数
        .setMaxResults(2)//每页查询的个数
        .list();

    session.getTransaction().commit();

}
  • sql方式分页查询
//通过 sql 分页查询 
public  void queryPageSQL() {
    Session session = H3Utils.getCurrentSession();
    session.beginTransaction();

    //构建 语句 
    String sql1 = "select * from t_customer ";
    List<Customer> allCustomer = session.createSQLQuery(sql1)
        .addEntity(Customer.class)//设置数据封装的对象
        .setFirstResult(0)//设置开始查询的页数
        .setMaxResults(2)//设置每页可以查询的数据个数
        .list();

    // 这里可以使用 limit 方式 来进行查询 
    String sql2 = "select * from t_customer limit 0,2";

    List<Customer> allCustomer2 = session.createSQLQuery(sql2)
        .addEntity(Customer.class)
        .list();

    session.getTransaction().commit();
    session.close();
}
  • QBC方式分页查询
//通过 QBC 分页查询 
public  void queryPageQBC() {
    Session session = H3Utils.getCurrentSession();
    session.beginTransaction();

    List<Customer> allCustomer = session.createCriteria(Customer.class)
                        .setFirstResult(0)//设置开始查询的页数
                        .setMaxResults(2)//设置每页查询的元素的个数
                        .list();
    session.getTransaction().commit();
    session.close();
}


6 绑定参数进行查询

  • hql 方式绑定参数查询
//Hql 绑定参数查询 
public void queryParamForHql(int num) {
    Session session = H3Utils.getCurrentSession();
    session.beginTransaction();
    //占位符方式
    String hql1 = "from Customer c where c.cid = ? ";
    Customer customer = (Customer) session.createQuery(hql1)
        .setInteger(0, num)//第0个参数 值为num 
        .uniqueResult();

    //别名方式
    String hql2 = "from Customer c where c.cid = :xx ";
    Customer customer2 = (Customer) session.createQuery(hql1)
        .setInteger("xx", num)//第0个参数 值为num 
        .uniqueResult();

    session.getTransaction().commit();
}
  • sql方式绑定参数查询
//SQL绑定参数查询 
public void queryParamForSql(int id) {
    Session session = factory.openSession();
    session.beginTransaction();
    //构建sql 
    String sql = "select * from t_customer c where c.cid= "+id;
    //通过 sql 来查询对应的数据 
    Customer customer = 
        (Customer) session
        .createSQLQuery(sql)//执行sql
        .addEntity(Customer.class)//封装数据的实体类型
        .uniqueResult();//获取一个对象

    session.getTransaction().commit();

 }
  • QBC方式绑定参数查询

    //QBC绑定参数查询 
public void queryParamForQBC() {
    Session session = H3Utils.getCurrentSession();
    session.beginTransaction();

    //QBC 
    Customer customer = 
        (Customer) session
        .createCriteria(Customer.class)
        .add(Restrictions.eq("cid", 1)) //添加约束
        .uniqueResult();

    session.getTransaction().commit();
    session.close();

    session.getTransaction().commit();

}

7 聚合函数

public void demo07(){
    Session session = factory.openSession();
    session.beginTransaction();

    //1 hql
    // * uniqueResult() 如果查询结果数大于1抛异常,如果是1返回结果,如果0返回null
    //HQL 方式一 
    Object objCount = session.createQuery("select count(*) from Customer").uniqueResult();

    //HQL 方式二 
    Long numCount = (Long)session.createQuery("select count(c) from Customer c").uniqueResult();


    //2 sql
    BigInteger sqlCount = (BigInteger) session.createSQLQuery("select count(cid) from t_customer").uniqueResult();

    //3 qbc
    Long numObj = (Long)session.createCriteria(Customer.class)
        .setProjection(
            Projections.projectionList()
            .add(Projections.rowCount())
            )
            .uniqueResult();

    //打印
    int num = numObj.intValue();

    System.out.println(num);

    session.getTransaction().commit();
    session.close();
}
早起的年轻人 CSDN认证博客专家 移动开发 项目管理 Java
只要用心去做,每一件事情还是有可能成功的,当然成功是没有界限的,只不过是达到自己心里的那个目标,公众号:我的大前端生涯,一个爱喝茶的程序员,通常会搞搞SpringBoot 、Herbinate、Mybatiys、Android、iOS、Flutter、Vue、小程序等.
©️2020 CSDN 皮肤主题: 代码科技 设计师:Amelia_0503 返回首页