系统业务有这样一个需求,每次版本进行变更时间,则需要创建新的记录,而不是在原来的基础上更替旧版本。
基于这样一个小小的需求,所有在数据库的设计时间,进行了表的自连接,当然这个只是假象的自连接,没有进行表自身的外键的映射;当有了很多的数据之后,需要加这个外键已经提示无法进行,只有把数据进行清空方可进行添加,但是表又是和很多的表做了外键的映射,总起来说就是一句话,表自身无法创建外键。
由此想到了只能用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 xxxxx
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 xxxxx
WHERE row_id = tempRootId;
END WHILE;
/*根据最根的rootid进行找所有的数据*/
SET idTemp = rootid;
SELECT COUNT(*) INTO xin FROM xxxxx
WHERE relate_ver_rowid = idTemp;
WHILE xin >0 DO
SET allIds = CONCAT(allIds,',',idTemp);
SELECT row_id INTO idTemp FROM xxxxx
WHERE relate_ver_rowid = idTemp;
SELECT COUNT(*) INTO xin FROM xxxxx
WHERE relate_ver_rowid = idTemp;
END WHILE;
IF xin = 0 THEN
SET allIds = CONCAT(allIds,',',idTemp);
END IF;
RETURN allIds;
END$$
DELIMITER ;
然后进行测试没有问题,接下来的问题就是怎么样在hibernate使用,这个地方我也不卖关子了,直接贴代码
业务层:
List list = struDao.executeSql(" select getRelateData(?)", new Object[]{dc.getRowId()});
数据层:
Query q = this.getCurrentSession().createSQLQuery(sql);
if (param != null && param.length > 0) {
for (int i = 0; i < param.length; i++) {
q.setParameter(i, param[i]);
}
}
List list = q.list();以上就是所有的代码,然后在去做其他的内容就可以了
关于模仿中关村在线的数据对比功能在接下来的某一天会进行详细的解释,敬请期待!
转载请注明出处,代码都是一点一点码的!!!