Hibernate通常是三種:hql查詢,QBC查詢和QBE查詢:
QBC 全稱:Query By Criteria
HQL 全稱:hibernate Query 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層程式碼:
Java程式碼
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層:
Java程式碼
public Pager findPageByCriteria(int pageNo, int pageSize, Map map)
{
Pager pager = null;
try
{
Criteria criteria = this.getSession().createCriteria(
Class.forName(this.getEntity()));
if (map != null)
{
Set<String> keys = map.keySet();
for (String key : keys)
{
criteria.add(Restrictions.like(key, map.get(key)));
}
}
// 獲取根據條件分頁查詢的總行數
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;
}
}
Map傳參方式對應BO層程式碼:
Java程式碼
public Pager getInfoByQuery2(int pageNo, int pageSize, String mendName,
String specialty, String post)
{
Map map = new HashMap();
if (mendName != null && mendName.length() > 0)
{
map.put(“mendname”, “%” + mendName + “%”);
}
if (specialty != null && specialty.length() > 0)
{
map.put(“specialty”, specialty);
}
if (post != null && post.length() > 0)
{
map.put(“post”, post);
}
Pager pager = erpManagerDao.findPageByCriteria(pageNo, pageSize, map);
return pager;
}
第二種方式:Criterion…不定引數傳參方式。其程式碼如下所示:
DAO層程式碼:
Java程式碼
public Pager findPageByCriteria(int pageNo, int pageSize,
Criterion… criterions)
{
Pager pager = null;
try
{
Criteria criteria = this.getSession().createCriteria(
Class.forName(this.getEntity()));
if (criterions != null)
{
for (Criterion criterion : criterions)
{
if (criterion != null)
{
criteria.add(criterion);
}
}
}
// 獲取根據條件分頁查詢的總行數
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;
}
}
Criterion…不定引數傳參方式對應BO層程式碼:
Java程式碼
public Pager getInfoByQuery3(int pageNo, int pageSize, String mendName,
String specialty, String post)
{
Criterion criterion1 = null, criterion2 = null, criterion3 = null;
if (mendName != null && mendName.length() > 0)
{
criterion1 = Restrictions.ilike(“mendname”, mendName,
MatchMode.ANYWHERE);
}
if (specialty != null && specialty.length() > 0)
{
criterion2 = Restrictions.ilike(“specialty”, specialty,
MatchMode.EXACT);
}
if (post != null && post.length() > 0)
{
criterion3 = Restrictions.ilike(“post”, post, MatchMode.EXACT);
}
Pager pager = erpManagerDao.findPageByCriteria(pageNo, pageSize,
criterion1, criterion2, criterion3);
return pager;
}
3、HQL檢索方式
HQL(Hibernate Query Language)是物件導向的查詢語言,它和SQL查詢語言有些相識。在Hibernate提供的各種檢索方式中,HQL是使用最廣的一種檢索方式。
使用Query介面分頁查詢DAO程式碼:
Java程式碼
public List<Object> findPageByQuery(int pageNo, int pageSize, String hql,
Map map)
{
List<Object> result = null;
try
{
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();
} catch (RuntimeException re)
{
throw re;
}
return result;
}
查詢所有記錄數的DAO程式碼:
Java程式碼
public int getTotalCount(String hql, Map map)
{
try
{
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));
}
Integer i = (Integer) query.list().get(0);
return i;
} catch (RuntimeException re)
{
throw re;
}
}
BO層程式碼:
Java程式碼
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 “);
Map map = new HashMap();
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 “);
}
if (post != null && post.length() > 0)
{
map.put(“post”, post);
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);
return pager;
}
相關文章
- hibernate中hql查詢
- Hibernate hql 多表查詢
- Hibernate 之強大的HQL查詢
- hibernate的三種查詢方式
- Hql查詢語句
- hibernate的hql查詢語句總結
- 391、Java框架46 -【Hibernate - 查詢HQL、查詢Criteria、查詢標準SQL】 2020.10.19Java框架SQL
- 如何使用Hibernate/JPA的JPQL/HQL查詢提取?
- Hibernate 查詢
- Spring Data Jpa 的簡單查詢多表查詢HQL,SQL ,動態查詢, QueryDsl ,自定義查詢筆記SpringSQL筆記
- SQL查詢的:子查詢和多表查詢SQL
- Hibernate查詢方式
- Hibernate——Query查詢
- select查詢之三:子查詢
- oracle 精確查詢和模糊查詢Oracle
- MySQL聯結查詢和子查詢MySql
- Hibernate 查詢語句
- 查詢之折半查詢
- 【Hibernate框架開發之八】Hibernate 查詢語言Query Language(HQL)框架
- mysql-分組查詢-子查詢-連線查詢-組合查詢MySql
- Hibernate_HQL--實體、屬性查詢,引數繫結,引用查詢(隨時溫習一遍)
- Elasticsearch中的Term查詢和全文查詢Elasticsearch
- MySQL之連線查詢和子查詢MySql
- 順序查詢和二分查詢
- 複雜查詢—子查詢
- 查詢——二分查詢
- 子查詢-表子查詢
- 查詢(1)--靜態查詢
- 查詢(2)--動態查詢
- SSH:hiberate實現資料的查詢(單查詢和全查詢)
- 各種免費好用的api,含天氣查詢、IP查詢、物流查詢等API
- MYSQL學習筆記25: 多表查詢(子查詢)[標量子查詢,列子查詢]MySql筆記
- Hibernate查詢自動更新
- Hibernate 框架的查詢方式框架
- Hibernate連線查詢join
- hibernate 動態查詢(DetachedCriteria )
- hibernate批量查詢問題
- 資料庫 - 連線查詢、巢狀查詢、集合查詢資料庫巢狀