最開始項目中HQL語句寫的比較隨意,后來看了下Hibernate 中Query和Criteria API,和sql語句的編譯過程 。了解到查詢條件不要直接使用字符串拼接,可以大大提高sql語句執行效率,代碼也更加規范安全。
1,hql中可以用"?"來占位,在使用query時,必須將"?"及其索引位置和字段名對應上(很容易出錯;不利於維護;)
2,hql另外一種方式占位:命名參數;
使用命名參數;冒號+字段名(或別名);等於給原來的"?"起了個名字;
String hql = "from User as user where user.name=:name";
//....
query.setString ("name", name); // 此處第一個參數必須和hql中參數命名一致;
query 的基本寫法:
使用“=:xx” 標識變量
setString("xx", ....) 插入對應的搜索條件
public String DocSerialNo(String perType, String organId) { String updateHql = "update LicenceSerialNo set curnum=curnum+1 where curareaid=:organId and areaid=:perType"; Query qr=this.getSession().createQuery(updateHql); qr.setString("organId", organId); qr.setString("perType", perType); int i=qr.executeUpdate(); if(i<1)return null; String findSerialHql="from LicenceSerialNo where curareaid=:organId and areaid=:perType"; Query findQr=this.getSession().createQuery(findSerialHql); findQr.setString("organId", organId); findQr.setString("perType", perType); LicenceSerialNo licSerial=(LicenceSerialNo) findQr.list().get(0); String licNo=licSerial.getLicencetype()+new DecimalFormat("0000").format(licSerial.getCurnum()); return licNo; }
query的set系列方法很多,不需要都記住,使用的時候查詢即可,重點掌握有特色的方法,如,
query.setfirstResult(0); // 設置查詢起始位置
query.setMaxResult(10); // 設置查詢記錄數
這兩個方法可以實現分頁;這種方法可以實現不依賴於數據庫(低耦合);
在hibernate.cfg.xml中的name為"dialect"(方言)的property來判斷是哪種數據庫,以方便采用對應數據庫的分頁實現:
mysql就使用limit,Oracle就是用roll number;
query最常用的方法
query.list() query.uniqueResult() set系列
criterial 使用:
cr.add() 在sql語句后拼接查詢限制條件
Restrictions類提供了查詢限制機制。它提供了許多方法,以實現查詢限制.
Criteria cr = session.createCriteria(Student.class); //生成一個Criteria對象 cr.add(Restrictions.eq("name", "Bill"));//等價於where name=’Bill’ List list = cr.list(); Student stu = (Student)list.get(0); System.out.println(stu.getName());