`
raymond2006k
  • 浏览: 295073 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

我的开发规范分享(二)- 禁用Hibernate HQL,QBC,QBE编程(1)

阅读更多

 

 

   【START 修改日志 当天 22:12 】:本文主要是针对基于Hibernate框架的项目开发中复杂查询的最佳实践。分析了前几个网友的意见,我想在几个基本方面hibernate QBC,QBE还是很方便的:

    1) 单表简单查询(基于字段的等值查询, 全部And运算)时,简单的汇总,如count等。

    2) 全动态查询条件, QBE很方便。

   【END 修改日志  当天 22:12 】

 

【START 修改日志 2008-9-19 21:20】:

   [quote="ziyuan"] ibatis完全符合lz的需求,,why not try it[/quote]

 

     同意你,我在公司项目中制定这个开发规范正符合 ibatis 的特点, 不过 Hibernate 对其也提供了完全的支持, 这两者在该功能上是一样的。

 

      因为 2006年项目启动时,已经确定使用 Hibernate 3, 而公司以前编程规范是使用 HQL, QBC 的 , 正好那次在项目初期对Hibernate 这一使用规范逐渐纠  正过来。

      如果是新的项目, 我想 ibatis 也是可以考虑的方案。
【START 修改日志 2008-9-19 21:20】

 

   

 

    2006年公司电信项目启动时,项目组选择沿用使用已久 的Hibernate及开发规范做 ORM方案。 做为公司新的电信项目的架构师一员,根据一直以来的项目经验,在项目进行2月后,面对复杂查询业务陆续增多,原有以Hibernate HQL,QBC 为特点的开发规范有些无法很好满足需求。

  

    因此在分析复杂查询业务 及 Hibernate 的特性特点, 我为 Hibernate 开发时制定了一个规范:禁用 HQL,QBC,QBE编程, 有三个要点,对于非单表的简单查询:

 

    1)程序员不得在Java代码中直接使用HQL;

    2)不得进行HQL拼装;

    3) 不得在 hbm.xml 映射文件中使用named HQL query。

 

    该规范按重要程度 基于四个方面的考虑:业务复杂度,程序员开发效率,维护难度和执行性能。  规范要求在 Hibernate 的 hbm.xml  文件配置Named SQL Query 来进行这些功能的开发。


    项目中我们对其进行了适当的易用性改造,关于我们项目中Named SQL如何具体应用,见下一篇分享:我的开发规范分享(二)- 禁用Hibernate HQL,QBC,QBE编程(2)

 

1. HQL,QBC:

    今天写这个分享短文,源于前几天回覆网友icewubin 的帖子: “一个关于Hibernate的优化实例:从HQL到QBC,从QBC到QBE,再到‘增强的’QBE”,主要是Hibernate查询的几种使用方式:HQL,QBC,QBE。

    先说 QBC,QBE,例如:(Hibernate QBC 示例代码)

 

public List<Product> getProducts(Product product) { 
final Example exampleProduct = 
Example.create(product). 
enableLike(MatchMode.ANYWHERE). 
excludeZeroes(); 

return (List<Product>) getHibernateTemplate().execute( new HibernateCallback() { 
public Object doInHibernate(Session session) throws HibernateException { 
Criteria crit =session.createCriteria(Product.class). 
add(exampleProduct); 
return crit.list(); 
} 
} 
); 
}

 

或例如:(Hibernate QBC 构造查询条件示例代码)

Restrictions.ne(propertyName, propertyValue);
crit = Restrictions.gt(propertyName, propertyValue);
crit = Restrictions.lt(propertyName, propertyValue);

 
 

2 ORM框架下复杂查询的处理

 

    几年前,我使用另一个ORM框架Ofbiz, 它的QBC,QBE与Hibernate类似,而且条件构造的类库更为完善. 当时使用过JDBC编程的我也对这种纯Java的,优雅的查询编程吸引,折服(当然这种思想确实是大牛们的伟大创新), QBC,QBE对单表,简单查询条件,两表关联查询支持很好.

 

    然而当项目设计完毕,进入开发阶段后,我们发现,这种查询开发模式遇到了瓶颈. 因为当时项目是财务系统,业务比较复杂, 多表关联查询,汇总查询,子查询等复杂查询陆续涌来. QBC,QBE的不足马上体现出现. 为此项目组对此类业务不得不用改用native sql来开发, 为与Ofbiz的ORM思想保持统一, 以配置sql为数据源的实体成为虚拟实体(Virtual Entity), 虚拟实体同样在映射文件中配置. 这个对Ofbiz的封装和改造,马上发挥用途,项目顺利,流畅的推进了。

 

3. 我们的项目规范:禁用 HQL,QBC,QBE编程

 

    回到我们的2006年启动的电信项目,使用的是Hibernate,它增加了HQL,以OO的方式写查询语句,也是牛人Gavin King的力作。但与Ofbiz类似,它对多表关联查询,汇总查询,子查询,三者混合查询的支持依然不足。作为新任架构师经过对公司之前架构规范分析,及一番思考,决定使用Hibernate时的一个规范:禁用 HQL,QBC,QBE编程。

 

    在项目开发规范中,我对这个规范进行了要点分析和总结。

    HQL,QBC开发的缺点:
    1) Java代码和查询语言混合开发,没有分离,易读性,维护性差;
    2) HQL编写和调试困难,对于较为复杂的查询,通常需要转化为SQL进行调试,调试完毕又要转为HQL,转换过程需要对HQL有较好的理解,但容易出错,开发时间长;
    3) QBC 编码量多,开发慢,易读性,维护性差;
    4) HQL,QBC功能有限,前面提到的多表关联查询,汇总查询,子查询,三者混合查询支持不佳或无法支持。相信朋友们都遇到过类似的需求。

    5) 还有一个考虑就是性能问题,有的HQL被Hibernate内部组装为SQL后,可能存在性能隐患,如果修改的话比较麻烦。

 

4.  复杂查询的解决方案

   解决方案仍然是,在hbm.xml 文件中配置named sql query。Ibatis 也有类似功能。

 

例子1:查询指定模块的所有下级模块, Hibernate 能将查询结果自动和 ModuleVO 映射起来

 

<!-- 查询指定模块的所有下级模块 -->
	<sql-query name="system.module.queryAllSubModules">
			select  module.MODULE_CODE as MODULECODE,
                       module.MODULE_NAME as MODULENAME,
                       module.MODULE_TYPE as MODULETYPE,
                       module.PARENT_CODE as PARENTCODE,
                       module.MODULE_DESC as MODULEDESC,
                       module.MODULE_URI  as MODULEURI,
                       module.MODULE_VIEW as MODULEVIEW
			from 
			(
			select t.child_code, t.offset from sys_module_rela t
			where t.ancestor_code = :parentCode
			) m1 join sys_module module
			on m1.child_code = module.module_code
			order by parent_code, module_order
	</sql-query>

 

 

例子2:以判断操作员是否对某个URI有访问权限为例, 返回值 val 大于0时表示有权限:

<sql-query name="system.perm.hasURIPermisson">
    <return-scalar column="val" type="java.lang.Integer"/>
   select count(1) val from sys_module module ,
   (   select distinct p.module_code from sys_oper_perm op , sys_perm p
    where   op.oper_id = :oprcode and op.perm_code = p.perm_code )  op
   where
   module.module_code = op.module_code
   and  module.module_uri = :currentURI
</sql-query>

 

我们项目中的Java代码的调用就更为简单了:

/**
  * 检查指定工号对 web请求 uri是否有权限。
  * @param oprcode
  * @param currentURI
  * @return
  * @throws Exception
  */
 public boolean doCheckURIPermission(String oprcode, String currentURI) throws Exception {
  PermDAO dao = (PermDAO) DAOFactory.build(PermDAO.class,user);
  
  Param param = new Param();
  param.getQueryConditions().put("oprcode", oprcode);  //设置固定参数 :oprcode

  param.getQueryConditions().put("currentURI", currentURI); //设置固定参数 :currentURI

  Integer count = (Integer)dao.queryUniqueByNamedSqlQuery("system.perm.hasURIPermisson", param);
  return count.intValue() > 0;
 }

 

而如果使用HQL,估计很难实现;

使用QBC查询,至少需要2-3步,代码较多,并且可能或查出冗余数据, 影响应用性能。

 

named sql 的优点和上面HQL,QBC的缺点正好相反:

    1) Java 代码和查询语句分离,易读性好,维护性好;
    2) 使用原生 SQL 开发,调试简便。如果是oracle,在pl/sql中进行调试,修改快捷而高效;
    3) 原生 SQL功能自然不必说,它是最全的。复杂的业务如果它都支持不了,那就得歇菜了。
    4) 充分发挥 DBMS 本身特定sql 语法的特性。

 

 5. 跨数据库问题

    在和网友icewubin 的讨论中,有一个问题值得说一说:跨数据库问题。他的意思是使用HQL,QBC可以保持数据库通用,这是他们的项目需求。实际上,我们当初的项目也是要求跨数据库的。解决方法是,针对Oracle,DB2,Informix等客户可能用到的db专门做sql调整, 也就是有两个DB的 sql 实现,(当时为新客户调整到DB2 sql,也就花了一周时间)。
    这个方案与Oracle BPEL等产品一样,例如:改产品出厂时,有针对不同数据库的DDL脚本文件,一个道理。

 

6.  Named SQL在我们项目中的具体应用。

 

    我们对其进行了适当的易用性改造,关于我们项目中Named SQL如何具体应用,要工作了,呵呵。下一篇分享文章,再聊. 我的开发规范分享(二)- 禁用Hibernate HQL,QBC,QBE编程(2)

分享到:
评论
57 楼 zhajie 2008-12-04  


本人赞同楼主的做法,命名查询的性能很好。hql既然无法替代sql,就可以不用,系统修改最大的部分就是sql部分,集中放置sql是个不错的选择。

56 楼 duanyong 2008-12-04  
我也很不明白。

现在很多企业需要别人会用hibernate。又不跨数据库操作,又要把它弄到项目中去。那么多的包弄到项目中,感觉很N。
55 楼 chenxm521 2008-09-27  
named query 什么意思.请教?
54 楼 icewubin 2008-09-26  
cyberblue 写道

yanghuw 写道

简单查询HQL,复杂查询sql-query

upheart 写道
很想知道,如果一个查询条件是动态的,比如根据用户输入的查询条件来构造,那这种方案怎么做?

    动态条件可以通过Where子句来判断条件,比如你需要查询订单,订单号的条件是可选的,你可以在查询语句中这么写:ORDERNO is null OR o.ORDERNO=:ORDERNO,这种方式和if-else一样,如果条件为空就判断下一个条件,不为空就比较条件,就是效率会稍微差一点





沒必要這麼做, iBATIS里有判斷null值的標籤.


在iBATIS手册第48页


Checks the equality of a property and a value, or another property.
Checks the inequality of a property and a value, or another property.
Checks if a property is greater than a value or another property.
Checks if a property is greater than or equal to a value or another property.
Checks if a property is less than a value or another property.
Checks if a property is less than or equal to a value or another property.


Checks if a property is available (i.e is a property of the parameter bean)
Checks if a property is unavailable (i.e not a property of the parameter bean)
Checks if a property is null.
Checks if a property is not null.
Checks to see if the value of a Collection, String or String.valueOf() property is null or empty (&ldquo;&rdquo; or size() < 1).
Checks to see if the value of a Collection, String or String.valueOf() property is not null and not empty (&ldquo;&rdquo; or size() < 1).




是啊,问题是感觉就是在用iBATIS的标签写这类判断逻辑?这样做合适么?逻辑一复杂,可维护性就不好了,又得不到IDE强大重构的帮助。
53 楼 cyberblue 2008-09-26  
<div class='quote_title'>yanghuw 写道</div>
<div class='quote_div'>
<p>简单查询HQL,复杂查询sql-query</p>
<div class='quote_title'>upheart 写道</div>
<div class='quote_div'>很想知道,如果一个查询条件是动态的,比如根据用户输入的查询条件来构造,那这种方案怎么做?</div>
<p>    动态条件可以通过Where子句来判断条件,比如你需要查询订单,订单号的条件是可选的,你可以在查询语句中这么写:ORDERNO is null OR o.ORDERNO=:ORDERNO,这种方式和if-else一样,如果条件为空就判断下一个条件,不为空就比较条件,就是效率会稍微差一点</p>
<p> </p>
<p> </p>
</div>
<p> </p>
<p>沒必要這麼做, iBATIS里有判斷null值的標籤.</p>
<p> </p>
<p>在iBATIS手册第48页</p>
<p> </p>
<p>&lt;isEqual&gt; Checks the equality of a property and a value, or another property.<br/>&lt;isNotEqual&gt; Checks the inequality of a property and a value, or another property.<br/>&lt;isGreaterThan&gt; Checks if a property is greater than a value or another property.<br/>&lt;isGreaterEqual&gt; Checks if a property is greater than or equal to a value or another property.<br/>&lt;isLessThan&gt; Checks if a property is less than a value or another property.<br/>&lt;isLessEqual&gt; Checks if a property is less than or equal to a value or another property.</p>
<p> </p>
<p>&lt;isPropertyAvailable&gt; Checks if a property is available (i.e is a property of the parameter bean)<br/>&lt;isNotPropertyAvailable&gt; Checks if a property is unavailable (i.e not a property of the parameter bean)<br/>&lt;isNull&gt; Checks if a property is null.<br/>&lt;isNotNull&gt; Checks if a property is not null.<br/>&lt;isEmpty&gt; Checks to see if the value of a Collection, String or String.valueOf() property is null or empty (“” or size() &lt; 1).<br/>&lt;isNotEmpty&gt; Checks to see if the value of a Collection, String or String.valueOf() property is not null and not empty (“” or size() &lt; 1).</p>
<p> </p>
52 楼 devil-wx 2008-09-26  
upheart 写道
很想知道,如果一个查询条件是动态的,比如根据用户输入的查询条件来构造,那这种方案怎么做?

还是要编写 查询语句 增加判断~~
51 楼 leisure 2008-09-26  
   用过一次hibernate,感觉可以这样用,简单操作的就用hibernate提供的支持,复杂的性能要求高的就写sql得了。
    这样用起来比ibatis配置文件稍微少了些,不用所有sql语句都写在文件里面
    折中处理吧,性能应该不是什么问题
    所以说hibernate太高深不敢用,我觉得大可不必,用它简单实用的就可以了,高深的不好控制的东西就不用了,老实自己写sql得了
    
   
50 楼 Unmi 2008-09-26  
最后的结论就是 禁用 Hibernate
49 楼 raymond2006k 2008-09-26  
langds 写道
我觉得楼主是在真正分析问题,后面回复的有很多只是简单地唱反调,因为他们拥护Hibernate~~!
我同意楼主在这样特定的需求条件下做出的Hibernate规范决策,当然,我也建议楼主可以转型使用iBatis,你的需求用iBatis会比Hibernate更适合。
现在Hibernate新版本中增加了些对SQL的自由定制支持,说明G.K还是知道这些问题的。如果Hibernate的NamingSQL能支持像iBatis那样的动态条件拼装那就OK了,只是目前没有这种功能。

另外,许多人说这是OO思想还是关系思想的对立问题,我到不这么认为,从性能角度上讲,两个层面都需要做优化,并且需要从架构层面考量的,并不是简单的一、两级Cache就万事大吉了。

如果是我,在面对这种动态条件拼装频繁的项目前提下,我也会选择使用iBatis,除非Hibernate下一个版本增加了动态拼装的功能。
当然,话又说回来,万事都不是绝对的,如果从纯性能的角度上来看,有些多表关联查询有可能只仅仅是简单的动态拼装也未必适用,因为不同的条件其优化后的SQL语句是不同的,需要走不同的执行路径,这个数据库密切相关。

有许多人认为用Hibernate就可以不用理解SQL了,我不认为是这样的,Hibernate只是一个工具,代替不了SQL,开发人员本身就应该编写SQL的责任,只不过不需要太过深入,高级的、棘手的优化工作DBA可以帮助你完成。

最后,我现在就是Hibernate+iBatis整合起来在用,如果再启一个全新的项目,在Hibernate没有对动态拼支持以前,我还会选择iBatis.  作为架构小组的一员,可不是选好 framework,把官方文档给 程序员 就完事了。

就事论事,大家可别攻击我。。。


哈哈,终于找到知音了。    
实际上我在公司的JavaEE 框架中已经完善的封装了动态拼装附加条件 SQL 的功能,并且用法比 Hibernate, ibatis 本身更为简单,算是一个增强扩展包。 
只是本文是该主题的第一部分, 提出了问题, 下篇会详细介绍这一增强扩展的用法和实现原理。最近比较忙,一直没时间整理。  

难得碰到以解决问题为道的知音,再次  一下。以后多交流。

48 楼 icewubin 2008-09-25  
我们就使Hibernate和Spring的JdbcTemplate混用的,没看出iBatis比JdbcTemplate强。在配置文件中进行动态拼sql本身就是比较搞笑的一件事。
47 楼 langds 2008-09-25  
我觉得楼主是在真正分析问题,后面回复的有很多只是简单地唱反调,因为他们拥护Hibernate~~!
我同意楼主在这样特定的需求条件下做出的Hibernate规范决策,当然,我也建议楼主可以转型使用iBatis,你的需求用iBatis会比Hibernate更适合。
现在Hibernate新版本中增加了些对SQL的自由定制支持,说明G.K还是知道这些问题的。如果Hibernate的NamingSQL能支持像iBatis那样的动态条件拼装那就OK了,只是目前没有这种功能。

另外,许多人说这是OO思想还是关系思想的对立问题,我到不这么认为,从性能角度上讲,两个层面都需要做优化,并且需要从架构层面考量的,并不是简单的一、两级Cache就万事大吉了。

如果是我,在面对这种动态条件拼装频繁的项目前提下,我也会选择使用iBatis,除非Hibernate下一个版本增加了动态拼装的功能。
当然,话又说回来,万事都不是绝对的,如果从纯性能的角度上来看,有些多表关联查询有可能只仅仅是简单的动态拼装也未必适用,因为不同的条件其优化后的SQL语句是不同的,需要走不同的执行路径,这个数据库密切相关。

有许多人认为用Hibernate就可以不用理解SQL了,我不认为是这样的,Hibernate只是一个工具,代替不了SQL,开发人员本身就应该编写SQL的责任,只不过不需要太过深入,高级的、棘手的优化工作DBA可以帮助你完成。

最后,我现在就是Hibernate+iBatis整合起来在用,如果再启一个全新的项目,在Hibernate没有对动态拼支持以前,我还会选择iBatis.

就事论事,大家可别攻击我。。。
46 楼 fuwang 2008-09-25  
zlst 写道
hibernate都用不好,还说个P呀

我经常听别人说hibernate很简单,但这样的人10个有9个不行,莫非你是这唯一的例外?
45 楼 zlst 2008-09-25  
hibernate都用不好,还说个P呀
44 楼 shenrd666888 2008-09-24  
发挥每个框架的优点,避免使用其缺点哈!

比如:hibernate+jdbc+ibatis+存贮过程 哈,因为程序员的水准不一样,架构师可能就要辛苦一点了 呵呵!
43 楼 icewubin 2008-09-24  
纠正楼主一下,原文作者不是我,是网友movingboy。

http://www.iteye.com/post/665448

不过我在文中有回复是真的。

icewubin 写道

那是你们公司特定的环境下的规定,像我们公司的产品必须要跨数据库,就肯定不能用named sql。

很多情况下,为了避免重复需要动态拼sql(hql),这部分的逻辑总得有个地方要放,我不认为放在配置文件中是个好主意,比如iBatis中的判断逻辑判断语法,配置文件和代码文件应该同等对待,都是代码,IDE对配置文件的感知能力是远不如代码文件的。

Java代码根据规范,组织好分层和代码的规范,一样可以分离开发,提高易读性和改进维护难度。
相反,配置文件的规模(行数和文件数和配置文件中的逻辑判断)达到一定程度一样是问题,本质上来讲这个复杂度是不可避免的,你总得找个地方放这些逻辑,不管是在代码、配置文件、存储过程,都一样的。


icewubin 写道
过于复杂的查询本来就不应该用同样的框架去做。
1.首先从商务上,我们公司会把这方面的需求转到BI上来做,数据仓库部门和数据挖掘部门是我们公司比较强的地方。
2.如果复杂度没有到BI这一层面的话,或者说必须要用Java来做的话,统计报表本来就应该单独设计,至于这部分的实现是不是用Hql还是本地sql可以另讨论,但是不要把统计报表类的需求延展到其他事务操作型的需求上。
3.我们的产品正好没有什么统计报表的需求,我也建议统计报表类的需求实现单独讨论比较好。


1.楼主就是一个电信的统计报表类项目,没必要说成是“电信级”项目吧。

2.Hibernate使用是需要相关配套设施的,比如如何把很多多表查询转换成单表查询,牵涉到整个框架的设计和支撑。

3.制定规范的时候,不知道楼主自己是不是经常参与开发实践,我虽然制定公司架构,但是自己一直是在一线和程序员们一起参与的(不会过多参与,不然瓶颈就在我身上了),要多了解使用框架和规范的程序员们的想法。

4.从楼主举的例子来看,好像数据库设计的不是特别好,因为资料不多,我也不好多说,但是那个子查询的例子,建议用exists实现。

5.hibernate本质上来说就是个高级的sql生成器+各种辅助设施。在设计系统的时候,大脑中浮现出来的当然是只有sql了,核心问题就是如何管好这些sql,不管是存储过程、ibatis、hibernate都是sql的拼装、构造的过程,然后就是评估拼装、构造的逻辑代码放在哪里更好的决策,仅此而已,不需要上纲上线。

6.很多人说jdbcTemplate好,我也经常用,是很好用,不过最好也看看它的整体结构,用的不好也会出性能问题。
42 楼 minimu 2008-09-24  
把hibernate用得更不像样子的人飘过。。。

不过个人觉得,能逮住老鼠,抓老鼠的成本和难度控制好就行。。。。


框架是解决问题的,但是现在太多为了框架而框架,也许俺水平太低了,勿见怪
41 楼 SSailYang 2008-09-24  
禁用hibernate查询,不用这么绝对吧。如果太复杂了自然还是写sql的直接
40 楼 javaeyename 2008-09-23  
以前做项目觉得hibernate效率比ibatis差一些,于是选用ibatis,ibatis要写很多sql语句,比如通过id进行查找,这也要一个select,在hibernate里面就会自动生成。同理的delete,update等等,表一多,sql语句数量就跟着猛涨,看到大片大片的简单的sql语句,俺心里觉得这么多头晕啦,以后在做了俺一定不再用ibatis,用hibernate万岁!ibatis提升的那一点性能,完全可以利用其他方面来弥补,用好缓存不知道提升的效果比那点提升强几百倍呀!
39 楼 anky_end 2008-09-23  
raymond2006k 写道
EXvision 写道
恭喜lz将hibernate成功转变成ibatis。
不会用不要瞎用。
ibatis适合你。



大牛老兄,如果你教条的认为用 HQL,QBC 才是 Hibernate 正统, 用 Named SQL Query 就不是在用 Hibernate ,那我也没话说,哈哈。

或者你个给个 Hibernate下 复杂查询的解决例子吧。
或者谈谈你所谓的“不瞎用”吧。


我觉得复杂查询,用ibatis得了。
hibernate和ibatis混用是完全可以的。

或者用jdcbtemplate也可以,抛开hibernate吧。

对于业务逻辑的处理hibernate还是很好的。
38 楼 kaka2008 2008-09-23  
fuwang 写道
我要抛弃hibernate,决定用ibatis之类的东西了。
不是hibernate不好,而是hibernate太深了,我玩不转,我觉得我再用几年也精通不了。
要做一个让人放心的业务系统,需要对hibernate非常熟悉,把hibernate用好才能做出来。
看看周边的情况,基本都是菜鸟在用 hibernate,做了几年的菜鸟在教新手如何用hibernate。
老板、售前、实施、项目经理都在叫:不就是增删改查吗?要有多简单就有多简单!


不知道gigix,抛出异常的爱等大牛们用不用hibernate,出来说句话吧。

相关推荐

    Hibernate-HQL-QBC-QBE

    标题中的“Hibernate-HQL-QBC-QBE”涵盖了四个重要的Java持久化框架Hibernate中的概念,分别是Hibernate Query Language(HQL)、Query By Criteria(QBC)、Query By Example(QBE)以及相关的库文件。以下是对这些...

    Hibernate_QBC和Hibernate_QBE

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

    Hibernate(HQL、QBC查询)源码

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

    hibernate-HQL语句大全

    hibernate-HQL语句大全

    Hibernate-HQL.rar_HQL_hibernate hql

    总之,Hibernate-HQL是Java开发中处理数据库查询的重要工具,通过理解和熟练运用HQL,可以显著提高开发效率,降低维护成本。通过深入学习和实践,开发者可以更好地驾驭这个强大的查询语言,提升项目开发的质量和效率...

    hibernateHQL关联查询

    Hibernate HQL关联查询遵循了SQL中连接查询的概念,但在语法上有所区别,使其更符合面向对象编程的习惯。Hibernate支持以下几种连接查询方式: 1. **内连接(Inner Join)**:`INNER JOIN` 或 `JOIN` ```java ...

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

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

    Hibernate hql查询语法总结

    总之,Hibernate HQL提供了丰富的查询功能,使得开发者能够以面向对象的方式处理数据库操作,大大提高了开发效率。通过熟练掌握HQL,可以更好地利用Hibernate框架实现数据库操作的灵活性和便捷性。在实际应用中,...

    Hibernate实例开发 HQL 与 QBC 查询

    本教程将深入探讨Hibernate中的两种查询方式:HQL(Hibernate Query Language)和QBC(Query By Example)。通过实例开发,我们将了解这两种查询方法的使用和它们之间的差异。 首先,HQL是Hibernate专门设计的一种...

    Hibernate HQL基础练习小列子+数据库文件

    Hibernate HQL基础练习小列子+数据库

    Hibernate-HQL-查询-Query资料

    通过学习这些文档,开发者可以掌握如何在Hibernate项目中高效地利用HQL进行数据查询,提升开发效率,同时保持代码的简洁和可维护性。理解并熟练运用HQL,是成为精通Hibernate的开发者不可或缺的一步。

    HQL与QBC的查询条件.doc

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

    Hibernate 课件_HQL

    ### Hibernate 课件_HQL 知识点解析 #### HQL查询 - **定义**: HQL(Hibernate Query Language)是一种面向对象的查询语言,它的语法类似于SQL,但不同于直接操作数据库表,HQL操作的是持久化的Java对象。这意味着...

    监控sql输出-可以查看hql转成sql的结果值

    标题中的“监控SQL输出-可以查看HQL转成SQL的结果值”指的是在使用HQL(Hibernate Query Language)进行数据库操作时,如何通过某些工具或手段来观察这些高级查询语句被转换成底层数据库能理解的SQL语句的过程,并对...

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

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

    hibernate3-hql.jar

    hibernate3-hql.jar .

    孙卫琴-精通hibernate-源码-chapter1

    5. **查询语言HQL与QBC**:Hibernate提供了自己的SQL方言HQL(Hibernate Query Language)和Query By Criteria API,让开发者可以以面向对象的方式执行查询,避免了直接写SQL的麻烦。 6. **Criteria查询**:...

    Hibernate_HQL.rar_hibernate HQL_hibernate hql src

    对hibernate的hql进行了详尽的讲解

    hibernate查询语言--HQL

    Hibernate 查询语言 HQL(Hibernate Query Language)是Hibernate框架提供的一种面向对象的查询语言,它是对SQL的封装,使得开发者可以使用面向对象的方式来处理数据库查询,避免了直接操作SQL带来的复杂性和对象与...

    HibernateHQL.zip_更新

    **标题:“Hibernate HQL.zip_更新”** **正文:** Hibernate是一个开源的对象关系映射(ORM)框架,它为Java开发者提供了对数据库操作的强大抽象层。HQL(Hibernate Query Language)是Hibernate提供的一种面向...

Global site tag (gtag.js) - Google Analytics