QBC 全稱:Query By Criteria
HQL 全稱:
hibernateQuery Language
HQL優點:與sql相近,可讀性好,功能強大,效率高。
HQL缺點:字元串形式,隻有在運作時才被解析,擴充性差。
QBC優點:提供面向對象的接口,編譯時就可被解析,便于排錯調試,擴充性好,允許使用者擴充Criteria接口.
QBC缺點:可讀性差,功能沒有HQL強大,不支援報表查詢和子查詢。
三:
hibernate 查詢match mode的四種模式
MatchMode.START:字元串在最前面的位置.相當于"like 'key%'"
MatchMode.END:字元串在最後面的位置.相當于"like '%key'"
MatchMode.ANYWHERE:字元串在中間比對.相當于"like '%key%'"
MatchMode.EXACT:字元串精确比對.相當于"like 'key'"
三:通常使用的Hibernate通常是三種:hql查詢,QBC查詢和QBE查詢:
1、QBE(Qurey By Example)檢索方式
QBE是最簡單的,但是功能也是最弱的,QBE的功能不是特别強大,僅在某些場合下有用。一個典型的使用場合就是在查詢視窗中讓使用者輸入一系列的查詢條件,然後傳回比對的對象。QBE隻支援=和like比較運算符,無法不大區間值,及其或的比對。在這種情況下,還是采用HQL檢索方式或QBC檢索方式。
Java代碼
public Pager findPageByExample(int pageNo, int pageSize, Object object)
{
Pager pager = null;
try
{
Criteria criteria = this.getSession().createCriteria(
Class.forName(this.getEntity()));
if (object != null)
{
criteria.add(Example.create(object).enableLike());
}
// 擷取根據條件分頁查詢的總行數
int rowCount = (Integer) criteria.setProjection(
Projections.rowCount()).uniqueResult();
criteria.setProjection(null);
criteria.setFirstResult((pageNo - 1) * pageSize);
criteria.setMaxResults(pageSize);
List result = criteria.list();
pager = new Pager(pageSize, pageNo, rowCount, result);
} catch (RuntimeException re)
throw re;
} finally
return pager;
}
}
注意代碼的第20行,即criteria.add(Example.create(object).enableLike());這一行,需将Example.create(object)調用.enableLike()方法,不然不能模糊查詢。
在BO層将需要模糊查詢的列用"%%"串起來,不然仍然和"="一樣。
BO層代碼:
public Pager getInfoByQuery(int pageNo, int pageSize, String mendName,
String specialty, String post)
EicMend eicMend = new EicMend();
if (mendName != null && mendName.length() > 0)
eicMend.setMendname("%" + mendName + "%");
if (specialty != null && specialty.length() > 0)
eicMend.setSpecialty(specialty);
if (post != null && post.length() > 0)
eicMend.setPost(post);
Pager pager = erpManagerDao
.findPageByExample(pageNo, pageSize, eicMend);
return pager;
執行SQL語句如下:
Sql代碼
Hibernate: select count(*) as y0_ from YJZX.EIC_MEND this_ where
(this_.MENDNAME like ? and this_.POST like ?)
Hibernate: select * from ( select this_.MENDID as MENDID23_0_, ……
this_.EXPERTREMARK as EXPERTR28_23_0_ from YJZX.EIC_MEND this_ where
(this_.MENDNAME like ? and this_.POST like ?) ) where rownum <= ?
是以隻需将需模糊查詢的列用“%%”連結即可。
2、QBC(Qurey By Criteria)檢索方式
采用HQL檢索方式時,在應用程式中需要定義基于字元串形式的HQL查詢語句。QBC API提供了檢索對象的另一種方式,它主要由Criteria接口、Criterion接口和Restrictions接口組成,它支援在運作時動态生成查詢語句。比較常見的是兩種傳參方式:一種是用map傳參,另一種是用Criterion…不定參數傳參。
Map傳參方式範例如下:
DAO層:
public Pager findPageByCriteria(int pageNo, int pageSize, Map map)
if (map != null)
Set<String> keys = map.keySet();
for (String key : keys)
{
criteria.add(Restrictions.like(key, map.get(key)));
}
Map傳參方式對應BO層代碼:
public Pager getInfoByQuery2(int pageNo, int pageSize, String mendName,
Map map = new HashMap();
map.put("mendname", "%" + mendName + "%");
map.put("specialty", specialty);
map.put("post", post);
Pager pager = erpManagerDao.findPageByCriteria(pageNo, pageSize, map);
第二種方式:Criterion…不定參數傳參方式。其代碼如下所示:
DAO層代碼:
public Pager findPageByCriteria(int pageNo, int pageSize,
Criterion... criterions)
if (criterions != null)
for (Criterion criterion : criterions)
if (criterion != null)
{
criteria.add(criterion);
}
Criterion…不定參數傳參方式對應BO層代碼:
public Pager getInfoByQuery3(int pageNo, int pageSize, String mendName,
Criterion criterion1 = null, criterion2 = null, criterion3 = null;
criterion1 = Restrictions.ilike("mendname", mendName,
MatchMode.ANYWHERE);
criterion2 = Restrictions.ilike("specialty", specialty,
MatchMode.EXACT);
criterion3 = Restrictions.ilike("post", post, MatchMode.EXACT);
Pager pager = erpManagerDao.findPageByCriteria(pageNo, pageSize,
criterion1, criterion2, criterion3);
3、HQL檢索方式
HQL(Hibernate Query Language)是面向對象的查詢語言,它和SQL查詢語言有些相識。在Hibernate提供的各種檢索方式中,HQL是使用最廣的一種檢索方式。
使用Query接口分頁查詢DAO代碼:
public List<Object> findPageByQuery(int pageNo, int pageSize, String hql,
Map map)
List<Object> result = null;
Query query = this.getSession().createQuery(hql);
Iterator it = map.keySet().iterator();
while (it.hasNext())
Object key = it.next();
query.setParameter(key.toString(), map.get(key));
query.setFirstResult((pageNo - 1) * pageSize);
query.setMaxResults(pageSize);
result = query.list();
return result;
查詢所有記錄數的DAO代碼:
public int getTotalCount(String hql, Map map)
Integer i = (Integer) query.list().get(0);
return i;
public Pager getInfoByQuery(int pageNo, int pageSize, String expertName,
String expertSpecialty, String post)
StringBuffer hql = new StringBuffer();
hql.append("select count(expertid) from EicExpert where 1=1 ");
if (expertName != null && expertName.length() > 0)
map.put("expertname", "%" + expertName + "%");
hql.append("and expertname like :expertname ");
if (expertSpecialty != null && expertSpecialty.length() > 0)
map.put("expertspecialty", expertSpecialty);
hql.append("and expertspecialty like :expertspecialty ");
hql.append("and post like :post ");
String queryHql = hql.substring(22);
List result = erpManagerDao.findPageByQuery(pageNo, pageSize,
queryHql, map);
int rowCount = erpManagerDao.getTotalCount(hql.toString(), map);
Pager pager = new Pager(pageSize, pageNo, rowCount, result);