mysql组织机构树迭代查询

转载自https://blog.csdn.net/u011935772/article/details/71419527

组织机构表结构

建表语句

drop table if exists Organize;

/*==============================================================*/
/* Table: Organize                                              */
/*==============================================================*/
create table Organize
(
   ID                   smallint not null auto_increment,
   ORG_NAME             int,
   UP_ID                int,
   ORG_CODE             char(4),
   primary key (ID)
);

初始化数据


迭代查询组织结构

oracle里面有迭代函数可用,

select XXX from table 
start with XXX
connect by prior XXX

mysql没有类似的迭代函数,需要自己写

创建函数语句

CREATE FUNCTION `getChildLst`(rootId INT)
    RETURNS varchar(1000)
    BEGIN
      DECLARE sTemp VARCHAR(1000);
      DECLARE sTempChd VARCHAR(1000);
    
      SET sTemp = ‘$’;
      SET sTempChd =cast(rootId as CHAR);
    
      WHILE sTempChd is not null DO
        SET sTemp = concat(sTemp,’,’,sTempChd);
        SELECT group_concat(id) INTO sTempChd FROM organize where FIND_IN_SET(up_id,sTempChd)>0;
      END WHILE;
      RETURN sTemp;
    END


查询语句如下(增加模糊条件可以对迭代查询后的数据进行筛选)

select o.ID orgId,o.ORG_CODE orgCode,o.ORG_NAME orgName from organize o
where FIND_IN_SET(id, getChildLst(45)) and o.ORG_NAME like ‘%%’;


关键是mybatis如何实现动态sql

mybatis映射文件配置如下:

 <resultMap id=”OrgInfoListPageMap” type=”com.znyq.wfCloud.service.pageModel.OrgInfolistPage” >
    <result column=”orgId” property=”orgId” jdbcType=”SMALLINT” />
    <result column=”orgName” property=”orgName” jdbcType=”VARCHAR” />
    <result column=”orgCode” property=”orgCode” jdbcType=”CHAR” />
  </resultMap>

 <select id=”findOrgInfListPage”  resultMap=”OrgInfoListPageMap” parameterType=”java.lang.String”>
   select o.ID orgId,o.ORG_CODE orgCode,o.ORG_NAME orgName from organize o
   <where>
   <if test=”orgId != null and ” != orgId” >
            FIND_IN_SET(id, getChildLst(#{orgId}))
   </if>
   <if test=”orgName != null and ” != orgName” >
            and o.ORG_NAME like CONCAT(CONCAT(‘%’, #{orgName}), ‘%’)
    </if>
    </where>
  </select>


映射的对象

public class OrgInfolistPage {

    private String orgId;

    private String orgCode;

    private String orgName;

    public String getOrgId() {
        return orgId;
    }

    public void setOrgId(String orgId) {
        this.orgId = orgId;
    }

    public String getOrgCode() {
        return orgCode;
    }

    public void setOrgCode(String orgCode) {
        this.orgCode = orgCode;
    }

    public String getOrgName() {
        return orgName;
    }

    public void setOrgName(String orgName) {
        this.orgName = orgName;
    }

}

OrganizeMapper:

List<OrgInfolistPage> findOrgInfListPage(@Param(value=”orgId”)String orgId,@Param(value=”orgName”)String orgName);






转载自https://blog.csdn.net/u011935772/article/details/71419527

组织机构表结构

建表语句

drop table if exists Organize;

/*==============================================================*/
/* Table: Organize                                              */
/*==============================================================*/
create table Organize
(
   ID                   smallint not null auto_increment,
   ORG_NAME             int,
   UP_ID                int,
   ORG_CODE             char(4),
   primary key (ID)
);

初始化数据


迭代查询组织结构

oracle里面有迭代函数可用,

select XXX from table 
start with XXX
connect by prior XXX

mysql没有类似的迭代函数,需要自己写

创建函数语句

CREATE FUNCTION `getChildLst`(rootId INT)
    RETURNS varchar(1000)
    BEGIN
      DECLARE sTemp VARCHAR(1000);
      DECLARE sTempChd VARCHAR(1000);
    
      SET sTemp = ‘$’;
      SET sTempChd =cast(rootId as CHAR);
    
      WHILE sTempChd is not null DO
        SET sTemp = concat(sTemp,’,’,sTempChd);
        SELECT group_concat(id) INTO sTempChd FROM organize where FIND_IN_SET(up_id,sTempChd)>0;
      END WHILE;
      RETURN sTemp;
    END


查询语句如下(增加模糊条件可以对迭代查询后的数据进行筛选)

select o.ID orgId,o.ORG_CODE orgCode,o.ORG_NAME orgName from organize o
where FIND_IN_SET(id, getChildLst(45)) and o.ORG_NAME like ‘%%’;


关键是mybatis如何实现动态sql

mybatis映射文件配置如下:

 <resultMap id=”OrgInfoListPageMap” type=”com.znyq.wfCloud.service.pageModel.OrgInfolistPage” >
    <result column=”orgId” property=”orgId” jdbcType=”SMALLINT” />
    <result column=”orgName” property=”orgName” jdbcType=”VARCHAR” />
    <result column=”orgCode” property=”orgCode” jdbcType=”CHAR” />
  </resultMap>

 <select id=”findOrgInfListPage”  resultMap=”OrgInfoListPageMap” parameterType=”java.lang.String”>
   select o.ID orgId,o.ORG_CODE orgCode,o.ORG_NAME orgName from organize o
   <where>
   <if test=”orgId != null and ” != orgId” >
            FIND_IN_SET(id, getChildLst(#{orgId}))
   </if>
   <if test=”orgName != null and ” != orgName” >
            and o.ORG_NAME like CONCAT(CONCAT(‘%’, #{orgName}), ‘%’)
    </if>
    </where>
  </select>


映射的对象

public class OrgInfolistPage {

    private String orgId;

    private String orgCode;

    private String orgName;

    public String getOrgId() {
        return orgId;
    }

    public void setOrgId(String orgId) {
        this.orgId = orgId;
    }

    public String getOrgCode() {
        return orgCode;
    }

    public void setOrgCode(String orgCode) {
        this.orgCode = orgCode;
    }

    public String getOrgName() {
        return orgName;
    }

    public void setOrgName(String orgName) {
        this.orgName = orgName;
    }

}

OrganizeMapper:

List<OrgInfolistPage> findOrgInfListPage(@Param(value=”orgId”)String orgId,@Param(value=”orgName”)String orgName);






猜你喜欢

转载自blog.csdn.net/zyxwvuuvwxyz/article/details/80224770