查看: 176|回复: 0

jeecg自定义datagrid查询

[复制链接]

497

主题

497

帖子

999万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
9995293
发表于 2020-1-10 10:08:37 | 显示全部楼层 |阅读模式
为什么要写这篇文章?
我们了解,使用 jeecg 提供的 CriteriaQuery 查询方式,确实能满足绝大数的需求,但是往往有那么个比较复杂的情况,需要我们直接去写 sql,比如多表查询呀等等等等~
因此,就整理了 "自定义 datagrid 查询" 这篇文章,希望这篇文章对你有所帮助。
后台datagrid方法
在此就不详细描述业务需求了,假装巴拉巴拉巴拉一堆复杂业务描述,最终用一个十分简单的
sql 给表示了:
SELECT t.* FROM `t_s_user` t;
看一下代码部分:
@RequestMapping(params = "datagrid")
public void datagrid(MyyWorkOrderEntity myyWorkOrder,HttpServletRequest request, HttpServletResponse response, DataGrid dataGrid) {
    CriteriaQuery cq = new CriteriaQuery(MyyWorkOrderEntity.class, dataGrid);

    //查询条件组装器
    org.jeecgframework.core.extend.hqlsearch.HqlGenerateUtil.installHql(cq, myyWorkOrder, request.getParameterMap());
    try{
        String sql1=" SELECT t.* FROM t_s_user t ";
        String sql2=" SELECT count(t.*) FROM t_s_user t ";

        // 某一个时间条件的案例
        String mwo_reporting_time_begin1 = request.getParameter("mwo_reporting_time_begin1");
        String mwo_reporting_time_end2 = request.getParameter("mwo_reporting_time_end2");

        if (StringUtil.isNotEmpty(mwo_reporting_time_begin1)) {
            sql1+=" and mwo_reporting_time>'"+request.getParameter("mwo_reporting_time_begin1")+"'";
            sql2+=" and mwo_reporting_time>'"+request.getParameter("mwo_reporting_time_begin1")+"'";
        }
        if (StringUtil.isNotEmpty(mwo_reporting_time_end2)) {
            sql1+=" and mwo_reporting_time<'"+request.getParameter("mwo_reporting_time_end2")+"'";
            sql2+=" and mwo_reporting_time<'"+request.getParameter("mwo_reporting_time_end2")+"'";
        }

        ...

        sql1+=" GROUP BY a.`id` order by mwo_reporting_time desc";
        sql2+=" GROUP BY a.`id` ) b";

        // 获取总数,用于分页使用
        long countMwo = systemService.getCountForJdbc(sql2);
        // 转换为 int 整形
        int allCounts = (int)countMwo;

        int pageSize = cq.getPageSize();// 每页显示数
        int curPageNO = PagerUtil.getcurPageNo(allCounts, cq.getCurPage(),pageSize);// 当前页

        //findForJdbc(sql1); sql
        //findHql(hql1); hql
        // 获取数据列表,参数一:查询的sql、参数二三:当前页码、数据总数
        List<Map<String, Object>> listMwo=systemService.findForJdbc(sql1, curPageNO, pageSize);

        cq.getDataGrid().setResults(listMwo);

        cq.getDataGrid().setTotal(allCounts);
    }catch (Exception e) {
        throw new BusinessException(e.getMessage());
    }
    TagUtil.datagrid(response, dataGrid);
}
该方法,主要实现 sql 部分的拼装,从而实现数据 List<Map<String,Object>> 的获取,注意,这个地方可是要牵扯到分页的!这也是为什么要同时写两个 sql ~
前台jsp界面
需要注意的是,界面中 t:dgCol 中的 filed 不同以往,该处需要使用数据库表字段,毕竟上边获取的 List<Map<String,Object>> 中没有实体属性嘛。
部分参考:
<t:dgCol title="更新人id"  field="update_by"></t:dgCol>
<t:dgCol title="更新人姓名"  field="update_name"></t:dgCol>
<t:dgCol title="更新日期"  field="update_date"  formatter="yyyy-MM-dd"></t:dgCol>
<t:dgCol title="创建人id"  field="create_by"></t:dgCol>
<t:dgCol title="创建人姓名"  field="create_name" queryMode="group"></t:dgCol>
最后
关于文中 "后台 datagrid 方法" 中的代码并没有进行详细的讲解,其实代码部分还是比较简单的,两个 sql ,一个用于求总数,一个用于实现条件查询,复杂部分主要在于业务 sql 的书写。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|霸气资源网

GMT+8, 2020-4-9 18:54 , Processed in 0.687500 second(s), 34 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.