mysql函数的创建以及hibernate调用mysql自定义函数以及数据对比功能,模仿中关村在线
2016-07-19 21:06
686 查看
系统业务有这样一个需求,每次版本进行变更时间,则需要创建新的记录,而不是在原来的基础上更替旧版本。
基于这样一个小小的需求,所有在数据库的设计时间,进行了表的自连接,当然这个只是假象的自连接,没有进行表自身的外键的映射;当有了很多的数据之后,需要加这个外键已经提示无法进行,只有把数据进行清空方可进行添加,但是表又是和很多的表做了外键的映射,总起来说就是一句话,表自身无法创建外键。
由此想到了只能用mysql的函数去处理了,做一个递归处理,来查询相应的信息。自己使用的是sqlyog这样一个客户端工具,创建function,就是直接在funciton右键就可以了,经过一段时间的编写,sql语句代码如下
DELIMITER $$
CREATE
/*[DEFINER = { user | CURRENT_USER }]*/
FUNCTION `pdm`.`getRelateData`( id VARCHAR(36))
RETURNS VARCHAR(2000)
BEGIN
DECLARE allIds VARCHAR(2000);
DECLARE idTemp VARCHAR(36);
DECLARE rootid VARCHAR(36);
DECLARE tempRootId VARCHAR(36);
DECLARE xin INT;
SET allIds = '';
/*根据传入的id找到最根的id*/
SELECT relate_ver_rowid INTO tempRootId FROM <span style="font-family: Arial, Helvetica, sans-serif;">xxxxx</span>
WHERE row_id = id;
SET rootid = id;
WHILE tempRootId IS NOT NULL AND tempRootId !='' DO
SET rootid = tempRootId;
SELECT relate_ver_rowid INTO tempRootId FROM <span style="font-family: Arial, Helvetica, sans-serif;">xxxxx</span>
WHERE row_id = tempRootId;
END WHILE;
/*根据最根的rootid进行找所有的数据*/
SET idTemp = rootid;
SELECT COUNT(*) INTO xin FROM <span style="font-family: Arial, Helvetica, sans-serif;">xxxxx</span>
WHERE relate_ver_rowid = idTemp;
WHILE xin >0 DO
SET allIds = CONCAT(allIds,',',idTemp);
SELECT row_id INTO idTemp FROM <span style="font-family: Arial, Helvetica, sans-serif;">xxxxx</span>
WHERE relate_ver_rowid = idTemp;
SELECT COUNT(*) INTO xin FROM <span style="font-family: Arial, Helvetica, sans-serif;">xxxxx</span>
WHERE relate_ver_rowid = idTemp;
END WHILE;
IF xin = 0 THEN
SET allIds = CONCAT(allIds,',',idTemp);
END IF;
RETURN allIds;
END$$
DELIMITER ;
然后进行测试没有问题,接下来的问题就是怎么样在hibernate使用,这个地方我也不卖关子了,直接贴代码
业务层:
List<String> list = struDao.executeSql(" select getRelateData(?)", new Object[]{dc.getRowId()});
数据层:
关于模仿中关村在线的数据对比功能在接下来的某一天会进行详细的解释,敬请期待!
转载请注明出处,代码都是一点一点码的!!!
基于这样一个小小的需求,所有在数据库的设计时间,进行了表的自连接,当然这个只是假象的自连接,没有进行表自身的外键的映射;当有了很多的数据之后,需要加这个外键已经提示无法进行,只有把数据进行清空方可进行添加,但是表又是和很多的表做了外键的映射,总起来说就是一句话,表自身无法创建外键。
由此想到了只能用mysql的函数去处理了,做一个递归处理,来查询相应的信息。自己使用的是sqlyog这样一个客户端工具,创建function,就是直接在funciton右键就可以了,经过一段时间的编写,sql语句代码如下
DELIMITER $$
CREATE
/*[DEFINER = { user | CURRENT_USER }]*/
FUNCTION `pdm`.`getRelateData`( id VARCHAR(36))
RETURNS VARCHAR(2000)
BEGIN
DECLARE allIds VARCHAR(2000);
DECLARE idTemp VARCHAR(36);
DECLARE rootid VARCHAR(36);
DECLARE tempRootId VARCHAR(36);
DECLARE xin INT;
SET allIds = '';
/*根据传入的id找到最根的id*/
SELECT relate_ver_rowid INTO tempRootId FROM <span style="font-family: Arial, Helvetica, sans-serif;">xxxxx</span>
WHERE row_id = id;
SET rootid = id;
WHILE tempRootId IS NOT NULL AND tempRootId !='' DO
SET rootid = tempRootId;
SELECT relate_ver_rowid INTO tempRootId FROM <span style="font-family: Arial, Helvetica, sans-serif;">xxxxx</span>
WHERE row_id = tempRootId;
END WHILE;
/*根据最根的rootid进行找所有的数据*/
SET idTemp = rootid;
SELECT COUNT(*) INTO xin FROM <span style="font-family: Arial, Helvetica, sans-serif;">xxxxx</span>
WHERE relate_ver_rowid = idTemp;
WHILE xin >0 DO
SET allIds = CONCAT(allIds,',',idTemp);
SELECT row_id INTO idTemp FROM <span style="font-family: Arial, Helvetica, sans-serif;">xxxxx</span>
WHERE relate_ver_rowid = idTemp;
SELECT COUNT(*) INTO xin FROM <span style="font-family: Arial, Helvetica, sans-serif;">xxxxx</span>
WHERE relate_ver_rowid = idTemp;
END WHILE;
IF xin = 0 THEN
SET allIds = CONCAT(allIds,',',idTemp);
END IF;
RETURN allIds;
END$$
DELIMITER ;
然后进行测试没有问题,接下来的问题就是怎么样在hibernate使用,这个地方我也不卖关子了,直接贴代码
业务层:
List<String> list = struDao.executeSql(" select getRelateData(?)", new Object[]{dc.getRowId()});
数据层:
Query q = this.getCurrentSession().createSQLQuery(sql); <span style="white-space:pre"> </span>if (param != null && param.length > 0) { <span style="white-space:pre"> </span>for (int i = 0; i < param.length; i++) { <span style="white-space:pre"> </span> q.setParameter(i, param[i]); } } List list = q.list();以上就是所有的代码,然后在去做其他的内容就可以了
关于模仿中关村在线的数据对比功能在接下来的某一天会进行详细的解释,敬请期待!
转载请注明出处,代码都是一点一点码的!!!
相关文章推荐
- MySQL 设置数据按条件查询下的序号
- 知数堂MySQL DBA在线培训第八期招生中
- 知数堂《MySQL 5.7 Replication新特性》分享总结
- mysql sort 性能优化
- MYSQL之插入更新删除数据
- Mysql 设置数据按条件查询下的序号
- mysql的索引
- mysql数据对象
- mysql命令行
- c#连接mysql实例
- MYSQL导入导出.sql文件
- c#连接到Mysql
- MYSQL之子查询
- MYSQL之连接查询
- 能否向Mysql视图中插入/更新/删除数据
- MySQL之聚合函数查询
- mysql中event的用法详解
- mysql check table脚本
- MySQL for Windows 解压缩版配置安装
- **MYSQL** 创建数据表