Hibernate框架的檢索方式

首先拿到session

                Configuration cfg = new Configuration().configure("hibernate.cfg.xml");
//hibernate3
SessionFactory sf = cfg.buildSessionFactory();
//open

Session session = sf.openSession();//管理對象的

session可以開啓提交事務:

session.beginTransaction();//開啓事務

session.getTransaction().commit();//提交  正式進庫


1. 唯一標識OID的檢索方式 (基礎)

    * session.get(對象.class,OID)

    Employee emp = (Employee) session.get(Employee.class, 7788);     

    session.load(對象.class)

    Employee emp3=(Employee)session.load(Employee.class, 6000)

        System.out.println(emp3.getEmpno()); //拿主鍵時,不查庫,不發sql
System.out.println(emp3.getEname());  //拿 非主鍵時,才查庫


2. HQL的檢索方式 (重要)
    * HQL(Hibernate Query Language) 是面向對象的查詢語言, 它和 SQL 查詢語言有些相似
    * 在 Hibernate 提供的各種檢索方式中, HQL 是使用最廣的一種檢索方式
    HQL與SQL的關係
    * HQL 查詢語句是面向對象的,Hibernate負責解析HQL查詢語句, 然後根據對象-關係映射文件中的映射信息, 把 HQL 查詢語句翻譯成相應的 SQL 語句. 
    * HQL 查詢語句中的主體是域模型中的類及類的屬性
    * SQL 查詢語句是與關係數據庫綁定在一起的. SQL查詢語句中的主體是數據庫表及表的字段


3. QBC的檢索方式(重要)

    * Query By Criteria -- 條件查詢

(1)查所有: Criteria crt = session.createCriteria(Employee.class);

       List<Employee> list = crt.list();//查所有

(2)crt.addOrder(Order.desc("ename"));//排序

(3)多條件

                        Criteria crt= session.createCriteria(Employee.class);
//排序
crt.addOrder(Order.desc("ename"));//根據員工姓名倒排
//條件
crt.add(Restrictions.like("ename", "%A%"));
crt.add(Restrictions.gt("sal", new Double(1500)));//1500D
//分頁
crt.setFirstResult(0);

crt.setMaxResults(3);

    * 條件查詢使用Criteria接口的add方法,用來傳入條件。
    * 使用Restrictions的添加條件的方法,來添加條件,例如:
        * Restrictions.eq           -- 相等
        * Restrictions.gt           -- 大於號
        * Restrictions.ge           -- 大於等於
        * Restrictions.lt           -- 小於
        * Restrictions.le           -- 小於等於
        * Restrictions.between      -- 在之間
        * Restrictions.like         -- 模糊查詢
        * Restrictions.in           -- 範圍
        * Restrictions.and          -- 並且
        * Restrictions.or           -- 或者

(4)

    // HQL帶Criterion條件的查詢
Criteria crtr = session.createCriteria(Product.class);
// like
crtr.add(Restrictions.like("productCode", "%10%"));
// sal>1500
crtr.add(Restrictions.gt("unitPrice", new Double(5)));
crtr.createAlias("category", "categoryT");//添加關聯表條件前置條件
//可以通過配置第3個參數,增加來改變hibernate的連接行爲
//crtr.createAlias("dept", "dept1",Criteria.LEFT_JOIN);
//增加分類名稱 like 果
crtr.add(Restrictions.like("categoryT.categoryName", "%果%"));//添加關聯表條件3
List<Product> ps = crtr.list();



4. 對象的導航的方式

    如果一個表中包含了另外一個表的主鍵,創建該表對應的實體類的時候,其外鍵對應的屬性爲另外一個表的id對應的實體。

    (不清不楚的)


5. SQL檢索方式(瞭解)
   
    基本語法
    Session session = HibernateUtils.getCurrentSession();
    Transaction tr = session.beginTransaction();
    SQLQuery sqlQuery = session.createSQLQuery("select * from cst_linkman where lkm_gender = ?");
    sqlQuery.setParameter(0,"男");
    sqlQuery.addEntity(Linkman.class);
    List<Linkman> list = sqlQuery.list();
    System.out.println(list);
    tr.commit();


1. HQL基本的查詢格式
    * 支持方法鏈的編程,即直接調用list()方法
    * 簡單的代碼如下
        * session.createQuery("from Employee").list();


2. 使用別名的方式
    * 可以使用別名的方式
        * session.createQuery("from Employee c").list();
        * session.createQuery("select c from Employee c").list();


3. 排序查詢
    * 排序查詢和SQL語句中的排序的語法是一樣的
        * 升序
            * session.createQuery("from Employee order by ename asc").list();


        * 降序
            * session.createQuery("from Employee order by ename desc").list();


4. 分頁查詢
    * Hibernate框架提供了分頁的方法,咱們可以調用方法來完成分頁
    * 兩個方法如下
        * setFirstResult(a)     -- 從哪條記錄開始,如果查詢是從第一條開啓,值是0
        * setMaxResults(b)      -- 每頁查詢的記錄條數


    * 演示代碼如下
        * List<Employee> list = session.createQuery("from Employee").setFirstResult(0).setMaxResults().list();


5. 帶條件的查詢
    * setParameter("?號的位置,默認從0開始","參數的值"); 不用考慮參數的具體類型
    * 按位置綁定參數的條件查詢(指定下標值,默認從0開始)
    * 按名稱綁定參數的條件查詢(HQL語句中的 ? 號換成 :名稱 的方式)
    * 例如代碼如下
        //1 按位置綁定參數
        Query query4=session.createQuery("from Employee s where ename like ? and hiredate>?");
query4.setParameter(0, "%A%"); //?從0開始,不分類型
SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd");
Date dd=null;
try {
dd=df.parse("1981-06-01");
} catch (ParseException e) {
e.printStackTrace();
}
query4.setParameter(1, dd); //傳java.util.date
List<Employee> lst4=query4.list();
for(Employee s:lst4){
System.out.println(s.getEname()+" "+s.getJob());
}


        //2 按名稱綁定參數
Query query5=session.createQuery("from Employee s where ename like :name ");
query5.setParameter("name", "%A%"); //?從0開始,不分類型
List<Employee> lst5=query5.list();
for(Employee s:lst5){
System.out.println(s.getEname()+" "+s.getJob());
}




HQL的投影查詢
例子:TestHibernate3.java
1. 投影查詢就是想查詢某一字段的值或者某幾個字段的值
2. 投影查詢的案例
    * 如果查詢多個字段,例如下面這種方式
    String hql2="select empno,ename from Employee s where s.empno=7788";
    Query query2=session.createQuery(hql2);
    List<Object[]> lst2=query2.list();
    for(Object[] s:lst2){
System.out.println(s[0]+" "+s[1]);
    }


    * 如果查詢兩個字段,也可以把這兩個字段封裝到對象中
    * 先在持久化類中提供對應字段的構造方法
    * 使用下面這種HQL語句的方式
    String hql3="select new Employee(empno,ename) from Employee s where s.empno=7788";
    Query query3=session.createQuery(hql3);
    List<Employee> lst3=query3.list();
    for(Employee s:lst3){
System.out.println(s.getEname());
    }




HQL的聚合函數查詢


1. 獲取總的記錄數
    
    Transaction tr = session.beginTransaction();
    List<Number> list = session.createQuery("select count(c) from Employee c").list();
    Long count = list.get(0).longValue();
    System.out.println(count);
    tr.commit();


2. 獲取某一列數據的和
    Transaction tr = session.beginTransaction();
    List<Number> list = session.createQuery("select sum(c.cust_id) from Employee c").list();
    Long count = list.get(0).longValue();
    System.out.println(count);
    tr.commit();




三、 QBC檢索方式


0. QBC:Query By Criteria  按條件進行查詢


1. 簡單查詢,使用的是Criteria接口
    List<Customer> list = session.createCriteria(Customer.class).list();
    for (Customer customer : list) {
        System.out.println(customer);
    }


2. 排序查詢
    * 需要使用addOrder()的方法來設置參數,參數使用org.hibernate.criterion.Order對象
    * 具體代碼如下:
        Transaction tr = session.beginTransaction();
        Criteria criteria = session.createCriteria(XXX.class);
        // 設置排序
        criteria.addOrder(Order.desc("lkm"));
        List<XXX> list = criteria.list();
        for (XXX s : list) {
            System.out.println(s);
        }
        tr.commit();


3. 分頁查詢
    * QBC的分頁查詢也是使用兩個方法
        * setFirstResult();
        * setMaxResults();


    * 代碼如下:
        Transaction tr = session.beginTransaction();
        Criteria criteria = session.createCriteria(XXX.class);
        // 設置排序
        criteria.addOrder(Order.desc("lkm"));
//分頁
        criteria.setFirstResult(0);
        criteria.setMaxResults(3);
        List<XXX> list = criteria.list();
        for (XXX s : list) {
            System.out.println(s);
        }
        tr.commit();


4. 條件查詢(Criterion是查詢條件的接口,Restrictions類是Hibernate框架提供的工具類,使用該工具類來設置查詢條件)
    * 條件查詢使用Criteria接口的add方法,用來傳入條件。
    * 使用Restrictions的添加條件的方法,來添加條件,例如:
        * Restrictions.eq           -- 相等
        * Restrictions.gt           -- 大於號
        * Restrictions.ge           -- 大於等於
        * Restrictions.lt           -- 小於
        * Restrictions.le           -- 小於等於
        * Restrictions.between      -- 在之間
        * Restrictions.like         -- 模糊查詢
        * Restrictions.in           -- 範圍
        * Restrictions.and          -- 並且
        * Restrictions.or           -- 或者


    * 測試代碼如下
        Transaction tr = session.beginTransaction();
        Criteria criteria = session.createCriteria(XXX.class);
        // 設置排序
        criteria.addOrder(Order.desc("lkm"));
        // 設置查詢條件
        criteria.add(Restrictions.or(Restrictions.eq("gender", "男"), Restrictions.gt("lkm", 3L)));
criteria.add(Restrictions.like("name","%A%"));
        List<XXX> list = criteria.list();
        for (XXX s : list) {
            System.out.println(s);
        }
        tr.commit();


5. 聚合函數查詢(Projection的聚合函數的接口,而Projections是Hibernate提供的工具類,使用該工具類設置聚合函數查詢)
    * 使用QBC的聚合函數查詢,需要使用criteria.setProjection()方法
    * 具體的代碼如下
        Session session = HibernateUtils.getCurrentSession();
        Transaction tr = session.beginTransaction();
        Criteria criteria = session.createCriteria(XXX.class);
        criteria.setProjection(Projections.rowCount());
        List<Number> list = criteria.list();
        Long count = list.get(0).longValue();
        System.out.println(count);
        tr.commit();


離線條件查詢


1). 離線條件查詢使用的是DetachedCriteria接口進行查詢,
     離線條件查詢對象在創建的時候,不需要使用Session對象,
     只是在查詢的時候使用Session對象即可。
2). 創建離線條件查詢對象
    * DetachedCriteria criteria = DetachedCriteria.forClass(XXX.class);


    具體的代碼如下
   
    Transaction tr = session.beginTransaction();
    DetachedCriteria criteria = DetachedCriteria.forClass(XXX.class);
    // 設置查詢條件
    criteria.add(Restrictions.eq("gender", "男"));
    // 查詢數據
    List<XXX> list = criteria.getExecutableCriteria(session).list();
    for (XXX s : list) {
        System.out.println(s);
    }
    tr.commit();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章