文章出處

我們先總結一下HQL語句常用語法:

  1. from子句:;
  2. select子句:用于選取對象和屬性;
  3. where子句:用于表達查詢語句的限制條件;
  4. 使用表達式:一般用在where子句中;
  5. order by子句:用于排序;

 下面根據我的某個項目的一張表進行總結才學習的HQL查詢: 

  1、準備數據:

   數據庫(Oracle):

 1 --類型表
 2 create table tb_type(
 3        id number(4) not null primary key,
 4        typename varchar2(10)
 5 
 6 )
 7 --添加測試數據
 8 insert into tb_type 
 9 values
10 (1,'喜劇');
11 insert into tb_type 
12 values
13 (2,'動作');
14 insert into tb_type 
15 values
16 (3,'愛情');
17 insert into tb_type 
18 values
19 (4,'動漫');
20 --dvd信息表
21 
22 create table tb_dvd
23 (
24 id number(4) not null,
25 name varchar2(20) not null,
26 star varchar2(18) not null,
27 intro varchar2(400) not null,
28 price number(2) not null,
29 num number(4) not null,
30 src varchar2(200) not null,
31 typeid number(2) not null
32 
33 )
34 
35 
36 --創建外鍵
37 alter table tb_dvd add constraint fk_dvd
38 foreign key(typeid)  referencing tb_type(id);
39 
40 --創建索引
41 create sequence seq_dvdindex;
DVD表

  2、配置DVD與HIbernate的映射關系

    (一)在HQL查詢語句中綁定參數:

    兩種方式:

      1、占位符:“?”

        hql="from DVDEntity as where name like ?";

        query.setParameter(0, "%"+emp.getEname()+"%");

      2、別名

        hql="from DVDEntity as where name like :name";

        query.setParameter("name", "%"+emp.getEname()+"%");

    

      query擁有很多設置參數的方法:

        setDouble()、setInteger()....等等

        我比較喜歡使用上面演示代碼提到的setParameter():設置參數;不需要指定參數類型,相當方便

  

  (二)uniqueResult:  

    query查詢到的是一個結果集,有和resultSet的異曲同工之妙!

    query.list()和.iteator()都是一系列數據,這里有人會問了,如果我知道查詢結果只有可能是一條結果,那么query提供這樣的方法了嗎?

    sure,query.uniqueResult()返回唯一結果,這樣就不浪費資源了;

    語法:

      Test test=(Test)query.uniqueResult();

 

   

 

  (三) 分頁

    

    分頁查詢:

      下篇詳記!

 

  (四) 投影&動態查詢

    什么是投影:

      有時候并不需要查詢對象的所有屬性,在沒有學習hibernate框架錢,我們使用封裝實體類,將需要的數據封裝在里面,他并不擁有完整的屬性,但對于業務它里面的屬性足夠了,我們在這里將投影理解為封裝一個業務需要的實體類,向業務傳遞數據,并且接受業務傳回的數據,所以猿們弄出投影這么個東西

      第一步:建立業務需要的實體類(DVDForPrint)

          實體類里面需要一個有參構造方法,可以修改值

      第二步:數據操作

        hql="select new DVDForPrint(屬性1,屬性2) from DVDEntity  as dvd where ";

        List<DVDForPrint> list=query.list();

      小總結:

        多聯系,慢慢的就能理解投影是什么了,不好解釋!

    動態查詢到底多動態:?

      需要使用from子句 ,where子句, [ 可能會使用表達式,orderby子句 ]

      代碼如下:

      這里我沒有細化出dvdfroPrint實體類,直接使用的dvdentity對象

 1 /**
 2      * 動態查詢dvd列表
 3      * @param dvd
 4      * @return
 5      */
 6     public List<DVDEntity> getDvdByHiber(DVDEntity dvd){
 7         List<DVDEntity> list=new ArrayList<DVDEntity>();
 8         //hql
 9         StringBuffer hql=new StringBuffer("from DVDEntity where 1=1");
10         try {
11             conf=new Configuration().configure();
12             factory=conf.buildSessionFactory();
13             session=factory.openSession();
14             query=session.createQuery(appendHql(dvd,hql).toString());
15             //指定dvd對象
16             query.setProperties(dvd);
17             list=query.list();
18         } catch (Exception e) {
19             // TODO: handle exception
20             e.printStackTrace();
21         }finally{
22             
23             session.close();
24         }
25         
26         
27         return list;
28         
29         
30     }
31     /**
32      * 拼接hql
33      * @param dvd
34      * @param hql
35      * @return
36      */
37     private StringBuffer appendHql(DVDEntity dvd,StringBuffer hql){
38         if(dvd.getName()!=null){
39             hql.append(" and name like :name");
40             
41         }if(dvd.getIntro()!=null){
42             hql.append(" and intro like :intro");
43             
44         }if(dvd.getStar()!=null){
45             hql.append(" and star like :star");
46             
47         }if(dvd.getPrice()!=null){
48             hql.append(" and price between :starPrice and :endPrice");
49             
50         }if(dvd.getTypeId()!=null){
51             hql.append(" and typeid=:typeid");
52             
53         }
54         if(dvd.getNum()!=null){
55             if(dvd.getNum()>0){
56                 hql.append(" order by num desc");
57                 
58             }
59             
60         }
61         return hql;
62         
63     }
64     
View Code

    經驗總結:

      暫無

 

      


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()