1. 程式人生 > >Hibernate 查詢資料

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