private void findChildList(AssetType parent,List<AssetType>list){
String hql = "from AssetType a where a.parentAssetType.assetTypeId=? ORDER BY a.sort,a.assetTypeName asc"
List<AssetType>childList = this.assetTypeDao
.getEntityManager()
.createQuery(hql)
.setParameter(1, parent.getAssetTypeId())
.getResultList()
int size = childList.size()
if(size>0){
for (int i = 0i <sizei++) {
AssetType assetType = childList.get(i)
List<AssetType>childs = assetType.getChildAssetType()
if(childs.size()>0){
list.addAll(childs)
this.findChildList(assetType, list)//递归查询节点的子节点
}
}
}
}
首先说一下Oracle的递归查询,相信大部分人都知道很简单。无非start with connect by 函数。下面是从pId向子节点递归查询的例子,unId是数据库表中的主键。
如果是从子节点递归到父节点查询,就把start with 换成unid,prior左右对换
下面再讲MySql 的递归查询方式。MySql没有Oracle的强大功能,虽然都是同一个公司的产品。所以只能靠自己写。有很多方法,用sql去循环查询,或者写存储过程,我这里只提供一种。就是新建一个function函数。
表结构不说了,无非就是 Id ,pId,其他列。下面是创建一个递归查询子节点的函数
DROP FUNCTION IF EXISTS queryChildrenPowerInfo
CREATE FUNCTION `queryChildrenPowerInfo` (powerId VARCHAR(2000))
RETURNS VARCHAR(2000)
BEGIN
DECLARE sTemp VARCHAR(2000)
DECLARE sTempChd VARCHAR(2000)
SET sTemp = '$'
SET sTempChd = cast(powerId as CHAR)
WHILE sTempChd is not NULL DO
SET sTemp = CONCAT(sTemp, ',', sTempChd)
SELECT group_concat(id) INTO sTempChd FROM t_discretionary_power where FIND_IN_SET(pId,sTempChd)>0
END WHILE
return sTemp
END
调用的时候:select queryChildrenPowerInfo("fa2528924c7e9168014c9bedfe04039c")该语句会返回Id和父Id等于传入参数powerId的一个字符串,中间有逗号隔开如图
下面这句代码的意思是,查询出 t_discretionary_power 表中,t.id 等于上面查询出的结果集的数据。FIND_IN_SET(A,B)是MYSQL的函数。意思是查找在B集合中有A的数据。相当于In
select t.* from t_discretionary_power t where FIND_IN_SET(t.id,queryChildrenPowerInfo('fa2528924c7e9168014c9bedfe04039c'))
select SYS_CONNECT_BY_PATH(列名,'>') from 表名start wITh 列名='0000000001'
connect by prior 列名(孩子列所有的列名)=列名(父列所有的列名)
这个查出来的样式如下:
000000000001>00000000>0000
不知道是不是你想要的。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)