这里是一个针对开源项目若依框架的使用我们动态sql的改造过程的描述,但是其中主要还是介绍了如何使用本框架来实现sql的动态查询和动态bean,如果您使用的是自身的系统,这里对外部框架的改造过程,也可以作为参考。
首先,我们以一个功能的改造,来简单说明:
上图为该项目的通知管理,初始为一个单表的操作,显示的字段为序号、公告标题、公告类型、状态、创建人、创建时间。
下图为SysNotice的所有属性;(同时在baseEntity中有4个公共属性:createBy、createTime、updateBy、updateTime)
这是该项目SysNoticeController.java钟list方法的原写法:根据查询通知信息,是最简单的功能
public TableDataInfo list(SysNotice notice)
{
startPage();
List<SysNotice> list = noticeService.selectNoticeList(notice);
return getDataTable(list);
}
-
首先我们想与用户表关联,并在列表区显示该用户所属部门的id,为了测试,我们先随便用noticeId与用户表关联(发现他们id值有相同的,这里只是为了测试),ok,写法如下:
public TableDataInfo list(SysNotice notice)
{
startPage();
List<SysNotice> list = noticeService.selectNoticeList(notice);
//使用SysNotice表的noticeId字段与sysUser表的userId进行关联
JoinTableBean userJtb=JoinTableBean.fastGetJtb("sysUser", "noticeId", "userId");
userJtb.joinInto(notice);//将构建好的userJtb放入notice这个查询实体中
userJtb.putSelect("deptId");//关联完成后,增加一个sysUser表的select字段。
List<SysNotice> list = noticeService.findList(notice);//调用findList方法查询数据
TableDataInfo tdi=getDataTable(list);//装载到分页信息中
return tdi;
}
我们可以看到打印后的sql:
拼接参数后sql____________:[com.ruoyi.system.mapper.SysNoticeMainMapper.findList]:
SELECT a.notice_id AS "noticeId", a.notice_title AS "noticeTitle", a.notice_type AS "noticeType", a.notice_content AS "noticeContent", a.status AS "status"
, a.create_by AS "createBy", a.create_time AS "createTime", a.update_by AS "updateBy", a.update_time AS "updateTime", a.remark AS "remark"
, sysuser57.dept_id AS "deptId"
FROM sys_notice a
LEFT JOIN sys_user sysuser57 ON notice_id = sysuser57.user_id
-
然后这时我们想增加一个查询条件deptId,需要注意的是deptId实际在SysNotice中是不存在该属性的,他是在SysUser表中,下面详细介绍:
首先我在notice.html页面的查询条件区,增加一个查询条件deptId字段,效果如下
这时的request会增加 一个叫做deptId的字段 ,如果输入了值,那么就会有内容,因此我们需要调用notice=notice.initDynaMap(request);将request中的值自动copy到notice中,这时我们看到的notice的效果如下:
我们可以看到,多了几个动态属性,其中一个是deptId
接下来详细代码:
public TableDataInfo list(SysNotice notice,HttpServletRequest request)
{
startPage();
noti