hibernate mysql自定义变量_mysql函数的创建以及hibernate调用mysql自定义函数以及数据对比功能,模仿中关村在线...

系统业务有这样一个需求,每次版本进行变更时间,则需要创建新的记录,而不是在原来的基础上更替旧版本。

基于这样一个小小的需求,所有在数据库的设计时间,进行了表的自连接,当然这个只是假象的自连接,没有进行表自身的外键的映射;当有了很多的数据之后,需要加这个外键已经提示无法进行,只有把数据进行清空方可进行添加,但是表又是和很多的表做了外键的映射,总起来说就是一句话,表自身无法创建外键。

由此想到了只能用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();以上就是所有的代码,然后在去做其他的内容就可以了

关于模仿中关村在线的数据对比功能在接下来的某一天会进行详细的解释,敬请期待!

转载请注明出处,代码都是一点一点码的!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值