当前访客身份:游客 [ 登录  | 注册加入尚学堂]
直播

flamen

拥有积分:3
这家伙太懒,还没有签名!

博客分类

笔记中心

课题中心

提问中心

答题中心

解答题中心

[置顶] 常规功能和模块自定义系统 (cfcmms)—027开发日志(创建ManyToMany的column2)

flamen 发表于 1年前 (2015-12-29 10:52:29)  |  评论(0)  |  阅读次数(447)| 0 人收藏此文章,   我要收藏   

027开发日志(创建ManyToMany的column2)


  一、我们用“用户”和“角色”模块来作为开发的例子。首先在用户类_User.java中加入@ManyToMany标签,使其可以通过hibernate来操作“角色”。
  @ManyToMany(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
  @JoinTable(name = "_UserRole", joinColumns = {
      @JoinColumn(name = "tf_userId", referencedColumnName = "tf_userId") }, inverseJoinColumns = {
          // _UserRole 中的字段名,           _Role 中的关联字段名                    
          @JoinColumn(name = "tf_roleId", referencedColumnName = "tf_roleId") })
  public Set<_Role> tf_Roles;


  二、接下来看看mysql能不能把结果集转换成一个字符串,在网上搜索了一下,还真有这个函数(如果没有这个函数的话,就准备自定义一个函数了)。函数名字为 group_concat。这个函数可以把指定字段的结果集用设定的分隔符拼接成一个字符串。例如在我的这个系统中的数据库上执行如下命令:
select  group_concat(tf_roleId ,',', tf_roleName SEPARATOR '|||')
	from _Role 
  得到的结果为:  '0000,管理员|||0005,市级管理员|||0010,查询角色' ,里面一共有三行数据,每行用 '|||'分隔,行中的字段用 ','号来分隔。
  有了这个函数,我们就可以把ManyToMany的结果集组合成一个字符串传到前台,这个结果集里面只有二列,一列是主键,一列是名字。下面来看看加到_User的表中的查询。最后一个字段加入了用户的所有角色的字符串信息。
    SELECT 
    _t9035.tf_userId AS tf_userId,
    _t9035.tf_userName AS tf_userName,
    _t9035.tf_loginName AS tf_loginName,
    _t9011.tf_departmentId AS P__t9011___tf_departmentId,
    _t9011.tf_departmentId AS _t9011___tf_departmentId,
    _t9011.tf_name AS _t9011___tf_name,
    (SELECT 
            GROUP_CONCAT(tf_roles0_.tf_roleId,
                    ',',
                    role1_.tf_roleName SEPARATOR '|||')
        FROM
            _UserRole tf_roles0_
                INNER JOIN
            _Role role1_ ON tf_roles0_.tf_roleId = role1_.tf_roleId
        WHERE
            tf_roles0_.tf_userId = _t9035.tf_userId)
FROM
    _User _t9035
        LEFT OUTER JOIN
    _Department _t9011 ON _t9011.tf_departmentId = _t9035.tf_departmentId
ORDER BY _t9011.tf_departmentId , tf_loginName
  以上查询查询语句为拼接而成,拼接过程比较复杂,这里就不讲解了。
  执行的结果,如下图所示:

  有了这个数据,我们就可以接着开发前台的column了。

分享到:0
关注微信,跟着我们扩展技术视野。每天推送IT新技术文章,每周聚焦一门新技术。微信二维码如下:
微信公众账号:尚学堂(微信号:bjsxt-java)
声明:博客文章版权属于原创作者,受法律保护。如果侵犯了您的权利,请联系管理员,我们将及时删除!
(邮箱:webmaster#sxt.cn(#换为@))
北京总部地址:北京市海淀区西三旗桥东建材城西路85号神州科技园B座三层尚学堂 咨询电话:400-009-1906 010-56233821
Copyright 2007-2015 北京尚学堂科技有限公司 京ICP备13018289号-1 京公网安备11010802015183