(crm筆記1-8)利用HQL進行條件查詢

利用HQL進行條件查詢



需求很多時候是對數據庫進行條件查詢,其中包括模糊查詢等等一些查詢語句,既然SSH框架中有hibernate,所以利用hql語句進行查詢將會非常方便。


下面也是相同的思路,從test類進行逆向寫查詢需要的方法


下面是測試類的代碼:

    @Test
    public void testFindObjectByConditionWithNoPage() {
        ISysUserGroupService sysUserGroupService =(ISysUserGroupService) ServiceProvider.getService(ISysUserGroupService.SERVICE_NAME);
//插入數據
        String name="李四";
        String principal="張三";

        List<SysUserGroup> list=sysUserGroupService.findSysUserGroup(name,principal);
    }



整體思路

測試類的目的是通過模擬struts2層調用業務層的方法,進行查詢,這裏假設已經在jsp頁面獲取到了name和principal兩個條件屬性,需要將這兩個條件傳入到dao層,並進行hql語句的組織,然後執行queryExcute進行數據查詢。


下面我們寫測試類中調用的 findSysUserGroup 方法

由於這是業務層的方法,所以需要在業務層中寫對應的接口:

public List<SysUserGroup> findSysUserGroup(String name, String principal);



這裏的 name,principal 只是樣例。

    public List<SysUserGroup> findSysUserGroup(String name, String principal) {

        String whereHql="";
        List paramsList=new ArrayList<>();//存放查詢的條件

        if(StringUtils.isNotBlank(name)){
            whereHql=" and o.name like ?";
            paramsList.add("%"+name+"%");
        }

        if(StringUtils.isNotBlank(principal)){
            whereHql=whereHql+" and o.principal like ?";
            paramsList.add("%"+principal+"%");
        }

        Object [] params=paramsList.toArray();
        System.out.println("whereHql:"+whereHql);//輸出hql中的where部分語句

        LinkedHashMap<String , String>orderby=new LinkedHashMap<String ,String>();
        orderby.put("o.name", "desc");//組織排序
//      orderby.put("o.id", "asc");

        //調用dao層的方法進行查詢
        List<SysUserGroup>list= sysUserGroupDao.findObjectByConditionWithNoPage(whereHql,params,orderby);

        for(SysUserGroup list1:list){//循環輸出查詢到的List序列
            System.out.println("list "+list1.toString());   
        }
        return list;
    }


這個方法:
1)主要是獲取測試類中的Name和principal兩個值,開始構建hql語句中的where部分。

2)然後將whereHql語句和組織排序的orderby語句傳入到dao層的查詢方法中,返回查詢結果list



在dao層編寫對應的調用的 findObjectByConditionWithNoPage 方法的接口:

    public List<T> findObjectByConditionWithNoPage(String whereHql,final Object[] params ,LinkedHashMap<String, String>orderby) {
        //獲取hql語句select前半部分
        String hql="select o from "+entityClass.getSimpleName()+" o where 1=1 ";
        System.out.println("hql:"+hql);

        if(StringUtils.isNotBlank(hql)){
            hql+=whereHql;//加入接收到的where部分
        }
        System.out.println("hql:"+hql);
        String orderbyStr=buildOrderBy(orderby);//寫一個方法組織orderby語句部分

        hql+=orderbyStr;//加入接收到的orderby部分
        System.out.println("hql "+hql);

        final String fhql=hql;

        //調用hibernate中的方法執行query語句
        @SuppressWarnings("unchecked")
        List list=(List<T>)this.getHibernateTemplate().execute(new HibernateCallback(){
            @Override
            public Object doInHibernate(Session session)throws HibernateException, SQLException {
                Query query=session.createQuery(fhql);
                if(params!=null&&params.length>0){
                    for(int i=0;i<params.length;i++)
                        query.setParameter(i, params[i]);
                }
                return query.list();
            }
        });
        return list;
    }
/**
     * 組織排序條件
     * @param orderby
     * @return
     */
    private String buildOrderBy(LinkedHashMap<String, String> orderby) {
        StringBuffer  buf=new StringBuffer("");
        if(orderby!=null&&!orderby.isEmpty()){
            buf.append(" order by ");
            for(Map.Entry<String ,String >em :orderby.entrySet()){
                buf.append(em.getKey()+" "+em.getValue()+",");
            }
            //去掉最後一個逗號
            buf.deleteCharAt(buf.length()-1);
        }

        return buf.toString();
    }



以上便是所有的hql查詢所需要的方法和操作,思路主要在於通過預先寫好hql語句,然後根據對應的hql語句分成select部分、where部分、orderby部分進行分別組織。利用佔位符進行語句中的條件傳入。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章