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

本文介绍了一种在MySQL中使用自定义函数解决表数据递归查询的方法,并提供了具体的实现代码及如何在Hibernate中调用该函数的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

邢庆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值