Hibernate通常是三種:hql查詢,QBC查詢和QBE查詢:

程式界小強發表於2016-06-08

一:Hibernate
QBC與HQL優缺點

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;   

}  






相關文章