我們先總結一下HQL語句常用語法:
- from子句:;
- select子句:用于選取對象和屬性;
- where子句:用于表達查詢語句的限制條件;
- 使用表達式:一般用在where子句中;
- 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;
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
經驗總結:
暫無
文章列表