Hibernate(3)hql查詢

目錄

查詢所有對象

條件查詢

使用帶問號站位符的條件查詢

使用命名佔位符的條件查詢

分頁查詢


使用環境:多表查詢,條件不復雜時使用

查詢所有對象

@Test
public void test4(){
    Session session = HibernateUtils.getCurrentSession();
    Transaction tx = session.beginTransaction();
    //~~~~~~~~~~~~~~~~~
    //1.書寫Hql   可以書寫完整的類名,如果類名在項目中唯一也可以簡寫 如果是查詢對象所有信息,即select *  則可以省略
    //string hql = "from com.ycsj.domain.Customer";   //書寫完整類型  省略select * 
    String hql = "from Customer";       //項目中唯一類名  
    //2.根據hql創建查詢對象
    Query query = session.createQuery(hql);
    //3.查詢
    //返回list結果
    List<Customer> list = query.list();
    //返回單個對象
    //query.uniqueResult();
    System.out.println(list);


    //~~~~~~~~~~~~~~
    tx.commit();

}

條件查詢

/**
 * 條件查詢
 * 在hql語句中不會出現數據庫相關的信息 條件中where子句查詢的是實體類中的字段
 */
@Test
public void test5(){
    Session session = HibernateUtils.getCurrentSession();
    Transaction tx = session.beginTransaction();
    //~~~~~~~~~~~~~~~~~
    //1.書寫Hql
    //string hql = "from com.ycsj.domain.Customer";
    String hql = "from Customer where cust_id=1";
    //2.根據hql創建查詢對象
    Query query = session.createQuery(hql);
    //3.查詢
    //返回list結果
   // List<Customer> list = query.list();
    //返回單個對象
    Customer custormer = (Customer) query.uniqueResult();
    System.out.println(custormer);


    //~~~~~~~~~~~~~~
    tx.commit();

}

使用帶問號站位符的條件查詢

/**
 * 條件查詢
 * 問號佔位符 在新版本的hibernate框架中使用?+數字 來替代,原來的問號
 */
@Test
public void test6(){
    Session session = HibernateUtils.getCurrentSession();
    Transaction tx = session.beginTransaction();
    //~~~~~~~~~~~~~~~~~
    //1.書寫Hql
    //string hql = "from com.ycsj.domain.Customer";
    String hql = "from Customer where cust_id=?0";
    //2.根據hql創建查詢對象
    Query query = session.createQuery(hql);
    //設置參數
    query.setParameter(0,1);

    //3.查詢
    //返回list結果
    // List<Customer> list = query.list();
    //返回單個對象
    Customer custormer = (Customer) query.uniqueResult();
    System.out.println(custormer);


    //~~~~~~~~~~~~~~
    tx.commit();

}

使用命名佔位符的條件查詢

/**
 * 條件查詢
 * 命名佔位符:+命名    
 */
@Test
public void test7(){
    Session session = HibernateUtils.getCurrentSession();
    Transaction tx = session.beginTransaction();
    //~~~~~~~~~~~~~~~~~
    //1.書寫Hql
    //string hql = "from com.ycsj.domain.Customer";
    String hql = "from Customer where cust_id=:cust_id";
    //2.根據hql創建查詢對象
    Query query = session.createQuery(hql);
    //設置參數
    query.setParameter("cust_id",1);   //與上面的命名相對應 

    //3.查詢
    //返回list結果
    // List<Customer> list = query.list();
    //返回單個對象
    Customer custormer = (Customer) query.uniqueResult();
    System.out.println(custormer);


    //~~~~~~~~~~~~~~
    tx.commit();

}

分頁查詢

/**
 * 分頁查詢
 */
@Test
public void test8(){
    Session session = HibernateUtils.getCurrentSession();
    Transaction tx = session.beginTransaction();
    //~~~~~~~~~~~~~~~~~
    //1.書寫Hql
    //string hql = "from com.ycsj.domain.Customer";
    String hql = "from Customer";
    //2.根據hql創建查詢對象
    Query query = session.createQuery(hql);
    //設置分頁信息
    query.setFirstResult(0);     
    query.setMaxResults(1);
    //3.查詢
    //返回list結果
    List<Customer> list = query.list();
    //返回單個對象
    //Customer custormer = (Customer) query.uniqueResult();
    System.out.println(list);


    //~~~~~~~~~~~~~~
    tx.commit();

}

排序

 @Test
    public  void  test1(){
        Session session = HibernateUtils.openSession();
        Transaction tx = session.beginTransaction();
        //~~~~~~~~~~~~~~
        String hql = " from LinkMan order by lkm_id asc";
        String hql2 = " from LinkMan order by lkm_id desc";

        Query query = session.createQuery(hql2);
        List<LinkMan> list = query.list();
        System.out.println(list);

        //~~~~~~~~~~~~~~~~~
        tx.commit();
        session.close();

    }

聚合函數

//count
    //max
    //min
    //avg
    @Test
    public  void  test2(){
        Session session = HibernateUtils.openSession();
        Transaction tx = session.beginTransaction();
        //~~~~~~~~~~~~~~

        String hql = " select count(*) from LinkMan order";
        String hql2 = " select avg(lkm_id) from LinkMan order";
        String hql3 = " select max(lkm_id) from LinkMan order";
        String hql4 = " select min(lkm_id) from LinkMan order";


        Query query = session.createQuery(hql3);
        Number number = (Number) query.uniqueResult();
        System.out.println(number);

        //~~~~~~~~~~~~~~~~~
        tx.commit();
        session.close();

    }

投影檢索

就是不查詢所有 只查詢部分字段
 @Test
    public  void  test3(){
        Session session = HibernateUtils.openSession();
        Transaction tx = session.beginTransaction();
        //~~~~~~~~~~~~~~

        String hql1 = " select lkm_name from LinkMan";
        String hql2 = " select lkm_id,lkm_name from LinkMan";     //返回數組
        String hql3 = " select new LinkMan(lkm_id,lkm_name) from LinkMan"; //需要在實體類中創建響應的構造函數 自動封裝到對象中



        Query query = session.createQuery(hql3);
        //查詢某一列,將查詢出來的結果封裝到一個數組中
        List list = query.list();
        System.out.println(list);

        //~~~~~~~~~~~~~~~~~
        tx.commit();
        session.close();

    }

多表查詢

/*回顧原生sql
* 交叉連接   ---笛卡爾積
*select * from A,B  A中有m條記錄 B中有n條記錄 查詢結果有m*n條記錄 這種情況的應用場景幾乎沒有
*內連接
*    |----隱式內連接
*         select * from A,B where A.xxx=B.yyy;
*    |----顯示內連接
*         select * from A inner join B on B.aid=A.id;        查詢交集
* 外連接
*    |----左外
*       select * from A left[outer] join B on B.aid=A.id;
*    |----右外
*       select * from A right[outer] join B on B.aid=A.id;
*
* */

Hql支持破切查詢 fetch

 /**
     * hql多表查詢
     * 內連接     將數據封裝到數組中
     *
     * [Ljava.lang.Object;@5432c277
     * [Ljava.lang.Object;@15e0fe05
     * [Ljava.lang.Object;@1128620c
     * [Ljava.lang.Object;@6bf13698
     */
    @Test
    public void  test(){
        Session session = HibernateUtils.openSession();
        Transaction tx = session.beginTransaction();
        //~~~~~~~~~~~~~~~~~~~~~~~~
        String hql = " from Customer c inner join c.linkMans";

        Query query = session.createQuery(hql);
        List<Object[]> list = query.list();
        for (Object[] arr:list){
            System.out.println(arr);

        }
        //~~~~~~~~~~~~~~~~~~~~~~~~
        tx.commit();
        session.close();
    }


    /**
     * 迫切內連接  幫助把數據封裝到對象中
     *[Customer{cust_id=1, cust_name='zhiduowa', linkMans=[LinkMan{lkm_id=1, lkm_name='董事長'}, LinkMan{lkm_id=2, lkm_name='總經理'}]}
     */
    @Test
    public void  test1(){
        Session session = HibernateUtils.openSession();
        Transaction tx = session.beginTransaction();
        //~~~~~~~~~~~~~~~~~~~~~~~~
        String hql = " from Customer c inner join fetch c.linkMans";

        Query query = session.createQuery(hql);
        List<Customer> list = query.list();
        System.out.println(list);
        //~~~~~~~~~~~~~~~~~~~~~~~~
        tx.commit();
        session.close();
    }

    /**
     * 左外連接  左邊的數據都會顯示
     */
    @Test
    public void  test3(){
        Session session = HibernateUtils.openSession();
        Transaction tx = session.beginTransaction();
        //~~~~~~~~~~~~~~~~~~~~~~~~
        String hql = " from Customer c left join c.linkMans";

        Query query = session.createQuery(hql);
        List<Object[]> list = query.list();
        for (Object[] arr:list){
            System.out.println(arr);

        }
        //~~~~~~~~~~~~~~~~~~~~~~~~
        tx.commit();
        session.close();
    }


    /**
     * 右外連接  右邊的數據都會顯示  被連接的數據全部顯示 不管有沒有對應
     */
    @Test
    public void  test4(){
        Session session = HibernateUtils.openSession();
        Transaction tx = session.beginTransaction();
        //~~~~~~~~~~~~~~~~~~~~~~~~
        String hql = " from Customer c right join c.linkMans";

        Query query = session.createQuery(hql);
        List<Object[]> list = query.list();
        for (Object[] arr:list){
            System.out.println(arr);

        }
        //~~~~~~~~~~~~~~~~~~~~~~~~
        tx.commit();
        session.close();
    }
}

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章