(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部分进行分别组织。利用占位符进行语句中的条件传入。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值