`
黑猪王子
  • 浏览: 129524 次
  • 性别: Icon_minigender_1
  • 来自: 云南
社区版块
存档分类
最新评论

hibernate的QBC无限级联查询,支持类似hql的多级

阅读更多
具体问题见:http://www.iteye.com/problems/25460
目前比较简陋的实现先用着,使用别名按照递归别名下去就ok了,性能估计有点悬
期待高手解决


实现如下:
说明下:
1,QueryItem 是参考springside的PropertyFilter,把一般查询分离开来,解耦service和dao,封装的是查询的属性名,和查询值,匹配方式,
2,doMultiAss名称磋了些,不要在意,就是user.blog.name这样的多级关联通过分解
最后直接用别名"blog_m.name"就ok了(_m是自己去取的别名)
3,这里有lgdlgd同志的另一种实现http://lgdlgd.iteye.com/blog/472799
需要的请参考

private void doMultiAss(QueryItem queryItem, DetachedCriteria criteria) {
		final String suffix="_m";//加个后缀,区别于hibernate自己在sql中生成的
		
		if (queryItem.getPropertyName().contains(".")) {
			//多层关联问题解决
			String[] props=queryItem.getPropertyName().split("\\.");
			
			StringBuffer perPropName=new StringBuffer(props[0]);
			StringBuffer alienName=new StringBuffer(perPropName).append(suffix);
			
			criteria.createAlias(perPropName.toString(), alienName.toString());
			for (int i = 1; i < props.length-1;i++) {
				perPropName=new StringBuffer(alienName).append(".").append(props[i]);
				alienName=new StringBuffer(props[i]).append(suffix);
				criteria.createAlias(perPropName.toString(), alienName.toString());
			}
			queryItem.setPropertyName(alienName.append(".").append(props[props.length-1]).toString());
		}
	
	}



代码简陋,欢迎斧正
分享到:
评论
3 楼 黑猪王子 2009-09-25  
lgdlgd 写道
哦,还有一个问题,如果你也是只取部份属性,最后没有结果集转换也能得到List<POJO>吗?

这个是没有问题  这个方法只是为了解决多级连的问题,具体查询实现在其他方法里,也是参考了springSide的方法,能够得到POJO的,推荐看看SpringSide的core源码,最为SSH的一个实践应用,里面有很多不错的地方

lgdlgd 写道
呵呵,和我的是一样的,不过别名有些不太一样而已,我的方式:
user.blog.name别名为user_blog.name,带有全路径,我这样做是有原因的,因为HIBERNATE不允许重复的别名,如果有user.org.parentOrg.parentOrg.name这种重复的时候你的程序会不会有问题?还有在上没有看到你判断之前是否已创建过当前别名的代码,当出现user.bolg.name 和 user.blog.url时,你的别名会不会重复了。

恩我的别名命名规则确实没有你的方案好,准备改进user.org.parentOrg.parentOrg.name,会出现问题

当出现user.bolg.name 和 user.blog.url时,这个没问题,因为我直接取了最后两级作查询的别名,这样产生的就是的别名是这样的 别名blog_m 对应user.blog
然后查询blog_m.name或是blog_m.url是没有问题的
2 楼 lgdlgd 2009-09-25  
哦,还有一个问题,如果你也是只取部份属性,最后没有结果集转换也能得到List<POJO>吗?
1 楼 lgdlgd 2009-09-25  
呵呵,和我的是一样的,不过别名有些不太一样而已,我的方式:
user.blog.name别名为user_blog.name,带有全路径,我这样做是有原因的,因为HIBERNATE不允许重复的别名,如果有user.org.parentOrg.parentOrg.name这种重复的时候你的程序会不会有问题?还有在上没有看到你判断之前是否已创建过当前别名的代码,当出现user.bolg.name 和 user.blog.url时,你的别名会不会重复了。
QueryItem:你使用了更加面向对象的方法,这个比我的要好些。

相关推荐

Global site tag (gtag.js) - Google Analytics