重大改版
 鱼翔空 2013-10-03 mysql/mariadb|   0 1501 
文章评分 90 次,平均分 5.0

今天一同事问我个功能,在点击当前分类的时候,把当前分类下所有子分类的内容获取到,我想起前一段时间写的oracle的递归查询了,直接复制给她了,

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的方言中了,看到这样就算了




 

除特别注明外,本站所有文章均为我要编程原创,转载请注明出处来自http://5ycode.com/article/273.html

关于
该用户很懒!
切换注册

登录

忘记密码 ?

切换登录

注册

扫一扫二维码分享