`
黑猪王子
  • 浏览: 131565 次
  • 性别: 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:你使用了更加面向对象的方法,这个比我的要好些。

相关推荐

    Hibernate(HQL、QBC查询)源码

    Hibernate(HQL、QBC查询)源码 Hibernate(HQL、QBC查询)源码 Hibernate(HQL、QBC查询)源码 Hibernate(HQL、QBC查询)源码 Hibernate(HQL、QBC查询)源码

    Hibernate QBC高级查询.rar

    本资源“Hibernate QBC高级查询”聚焦于Hibernate Query by Criteria(QBC)的高级用法,旨在帮助开发者深入理解并熟练运用这一强大的查询机制。 Query by Criteria是Hibernate提供的另一种查询方式,与HQL...

    Java_Hibernate QBC条件查询对比

    本篇文章将深入探讨Hibernate中的QBC(Query By Example)条件查询与传统的HQL(Hibernate Query Language)查询的对比,帮助开发者更好地理解和选择适合的查询方式。 QBC(Query By Example)是Hibernate提供的一...

    Hibernate实例开发 HQL 与 QBC 查询

    首先,HQL是Hibernate专门设计的一种面向对象的查询语言,它的语法类似于SQL,但更注重对象而非表。例如,如果我们有一个`User`实体,我们可以使用HQL来获取所有用户: ```java Session session = sessionFactory....

    QBC的各种查询

    在实际开发中,QBC与Hibernate的其他查询方式,如HQL(Hibernate Query Language)和Criteria API,可以灵活搭配使用,根据项目需求选择最适合的查询手段。QBC的优势在于它的直观性和灵活性,但可能在性能上略逊于...

    Hibernate_QBC和Hibernate_QBE

    标题"Hibernate_QBC和Hibernate_QBE"提及了两个关于Hibernate的查询方式,即Query By Criteria(QBC)和Query By Example(QBE)。Hibernate是Java领域中一个广泛使用的对象关系映射(ORM)框架,它允许开发者以面向...

    HQL与QBC的查询条件.doc

    HQL(Hibernate Query Language)和QBC(Query By Example)是Hibernate提供的两种主要的查询方式,它们提供了灵活且强大的查询能力。下面将详细阐述这两种查询方式以及它们的查询条件。 **HQL(Hibernate Query ...

    Hibernate-HQL-QBC-QBE

    2. HQL(Hibernate Query Language):HQL是Hibernate提供的面向对象的查询语言,类似于SQL,但它是针对对象而不是表格进行操作的。HQL允许开发者以类和对象的方式编写查询,支持复杂的查询结构,如连接、子查询、...

    Hibernate QBC分页

    QBC是Hibernate提供的一种基于对象的查询方式,与HQL(Hibernate Query Language)类似,但更接近Java的API,允许我们根据对象的属性来构建查询条件。在进行分页查询时,QBC提供了`setFirstResult()`和`...

    QBC_hibernate完整用法

    收录了QBC_hibernate完整用法.大家可以下载看看.作为参考.

    hibernate+spring+springmvc框架 @注解开发 详细配置注释/及hibernate的HQL/QBC/SQL查询代码使用及注释

    之前也发了一个,这个包含之前的,还添加了hibernate对数据库操作的代码(注意:controller层两个QBC/SQLTest代码不能运行,只是写出了操作数据库的除了HQL的另外2种方式)。我发现现在还是有很多公司用hibernate+...

    SSH笔记-HQL查询、QBC、本地SQL查询

    SSH笔记-HQL查询(基于位置参数查询、基于命名参数查询、分页查询、命名查询、投影查询报表查询、内/迫切内/左外/迫切左外连接查询)、QBC(QBC检索查询、统计查询、排序查询、HQL操作数据库)、本地SQL查询

    QBC的相关讲义和例题

    QBC的相关讲义和例题 QBC(Query By Criteria)查询方式是Hibernate提供的“更加面向对象”的一种检索方式。QBC在条件查询上比HQL查询更为灵活,而且支持运行时动态生成查询语句。

    Hibernate_QBC查询[归类].pdf

    Hibernate QBC(Query By Criteria)查询是Hibernate框架中一种面向对象的查询方式,它通过提供Criteria API使得开发者能够更方便地构建和执行SQL查询。QBC查询的优势在于它允许程序员用更加面向对象的方式处理...

    Hibernate的查询方式

    除了HQL,Hibernate还支持QBC查询方式,这是一种基于Criteria API的查询方式,提供了更加类型安全和灵活的查询构建器。通过Criteria API,开发者可以动态地构建复杂的查询条件,而不必关心具体的SQL语法。 ##### ...

    hibernate实现动态SQL查询

    在Hibernate中,我们通常使用HQL(Hibernate Query Language)或Criteria API进行查询,但这些方式并不支持复杂的动态查询。为了实现动态SQL,我们可以借助于Hibernate的QBC(Query By Criteria)和Criteria API,...

    精通hibernate HQL语言

    HQL,全称Hibernate Query Language,是Hibernate框架提供的一种面向对象的查询语言,它的语法结构与SQL相似,但主要针对对象和实体进行操作,而不是直接操作数据库表。HQL是Hibernate官方推荐的检索数据的主要方式...

    hibernate查询详解

    Hibernate Query Language(HQL)是一种面向对象的查询语言,类似于SQL但更专注于对象而不是表格。HQL查询分为HQL查询和HQL命名查询。 A. HQL查询:通过编写HQL语句来执行查询,例如: ```java String hql=...

    Hibernate各种查询:联表查询 分页查询 位置参数查询(?) 占位符查询(冒号查询) 统计查询

    总的来说,Hibernate的`Criteria`、`Query`以及QBC(Query By Criteria)提供了灵活且强大的查询手段,它们不仅支持基本的单表查询,还能处理复杂的联表、分页、参数绑定和统计需求,是Java开发者进行数据库操作的...

Global site tag (gtag.js) - Google Analytics