今天一同事问我个功能,在点击当前分类的时候,把当前分类下所有子分类的内容获取到,我想起前一段时间写的oracle的递归查询了,直接复制给她了,
过了一会她说没法用,因为公司的项目一直都是用oracle,我以为也是oracle的了,她说是mysql,我就百度了一下,给她写了个函数.
CREATE FUNCTION getIds (rootId INT) RETURNS varchar(1000) BEGIN DECLARE sTemp VARCHAR(1000); DECLARE sTempChd VARCHAR(1000); SET sTemp = '0';//给一个默认值,防止没有值的时候出现null SET sTempChd =cast(rootId as CHAR); WHILE sTempChd is not null DO SET sTemp = concat(sTemp,',',sTempChd); SELECT group_concat(id) INTO sTempChd FROM kb_classify where FIND_IN_SET(parent_id,sTempChd)>0; END WHILE; RETURN sTemp; END
自定义的函数hibernate不认,我想重写hibernate的mysql的方言,那hibernate应该认了吧,
可实际上并不是那么一回事.
我做了下试验,如果我我直接写
select getIds(1)
在mysql的客户端可以查到内容,如果我把该函数嵌套到sql中时候就没有解析过,比如
select * from tableName where pid in (select getIds(1))
这个时候select getIds(1)不能解析成查到的值,本来想一条sql执行完毕,现在必须分开写,查询一次递归,再去把得到的值传递进去.
public List getListById(Integer id){ StringBuffer idsSql=new StringBuffer(); ids.append("select getIds(") .append(id) .append(")"); String ids=(String)this.getSession.createSQLQuery(idsSql.toString()).uniqueResult(); StringBuffer listSql=new StringBuffer(); listSql.append("select * from table where pid in(") .append(ids).append(")"); ..... }
本来还想把这个函数注册到mysql的方言中了,看到这样就算了
文章评论