`
moogle
  • 浏览: 109000 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

Hibernate 对象查询生成的SQL的疑问[已解决]

    博客分类:
  • Java
阅读更多
  惟一外键关键的情况(many-to-one):我用了二个这样的例子进行测试

    环境:Oracle8i,Hibernate3.1.3

    2张表都是三个字段,然后进行对象查询

    2种情况的映射文件都是相似的,只是属性具体名称稍有不同

      

    xml 代码
    1.         <id name="id" type="java.lang.Integer">  
    2.             <column name="id" />  
    3.             <generator class="assigned" />  
    4.         id>  
    5.         <property name="gzzh" type="java.lang.String">  
    6.             <column name="gzzh" length="20" />  
    7.         property>  
    8.         <property name="www" type="java.lang.String">  
    9.             <column name="www" length="30" />  
    10.         property>  
    11.   
    12. <many-to-one name="wnote" class="test.db.Www" column="gzzh" lazy="false" update="false" insert="false"/>  

     

    加黑加粗的是man-to-one对应的外键.

    A.

    Hibernate: select this_.id as id2_0_, this_.gzzh as gzzh2_0_, this_.www as www2_0_ from test_user this_

    B

    Hibernate: select this_.id as id0_0_, this_.SQR as SQR0_0_, this_.DWDM as DWDM0_0_, this_.sqr as sqr0_0_ from NDZJXX this_

     

    B.看加红的地方,却凭空多出来了一个字段

    这个是因为什么呢?

    这二种情况下的语句都能执行,也不影响最后取出来的结果。

    大家知道Criteria的限制结果记录数目的时候  setFirstResult(0).setMaxResults(100)

    生成的SQL是形如 select * from ( … ) where rownum <= ?

    A情况当然是没有任何问题的。

    B情形如下:

    select * from ( select this_.id as id0_0_, this_.SQR as SQR0_0_, this_.DWDM as DWDM0_0_, this_.sqr as sqr0_0_ from NDZJXX this_ ) where rownum <= ?

    这个时候就有问题了:

    ORA-00918: column ambiguously defined

     

    B情况下使用HQL也是出现同样的问题。

     

    这个让我很疑惑,目前我在B情况下只好规避使用Criteria的限制结果记录数目的操作,改用Native Sql,

分享到:
评论
4 楼 moogle 2007-04-17  
多谢janh提醒。我测试了一下终于发现:<br/>
<br/>
<div class='code_title'>xml 代码</div>
<div class='dp-highlighter'>
<div class='bar'> </div>
<ol class='dp-xml' start='1'>
    <li class='alt'><span><span class='tag'>&lt;</span><span class='tag-name'>property</span><span> </span><span class='attribute'>name</span><span>=</span><span class='attribute-value'>"gzzh"</span><span> </span><span class='attribute'>type</span><span>=</span><span class='attribute-value'>"java.lang.String"</span><span class='tag'>&gt;</span><span>    </span></span></li>
    <li class=''><span>             <span class='tag'>&lt;</span><span class='tag-name'>column</span><span> </span><span class='attribute'>name</span><span>=</span><span class='attribute-value'>"gzzh"</span><span> </span><span class='attribute'>length</span><span>=</span><span class='attribute-value'>"20"</span><span> </span><span class='tag'>/&gt;</span><span>    </span></span></li>
    <li class='alt'><span> <span class='tag'><!----><span class='tag-name'>property</span><span class='tag'>&gt;</span><span>   </span></span></span></li>
    <li class=''><span> <span class='tag'>&lt;</span><span class='tag-name'>many-to-one</span><span> </span><span class='attribute'>name</span><span>=</span><span class='attribute-value'>"wnote"</span><span> </span><span class='attribute'>class</span><span>=</span><span class='attribute-value'>"test.db.Www"</span><span> </span><span class='attribute'>column</span><span>=</span><span class='attribute-value'>"gzzh"</span><span> </span><span class='attribute'>lazy</span><span>=</span><span class='attribute-value'>"false"</span><span> </span><span class='attribute'>update</span><span>=</span><span class='attribute-value'>"false"</span><span> </span><span class='attribute'>insert</span><span>=</span><span class='attribute-value'>"false"</span><span class='tag'>/&gt;</span><span>  </span></span></li>
</ol>
</div>
Hibernate生成的sql<br/>
<span class='postbody'>select this_.id as id2_0_, <font color='#ff00ff'><span style='font-weight: bold;'>this_.gzzh as gzzh2_0_</span></font>, this_.www as www2_0_ from test_user this_<br/>
<br/>
如果将<br/>
</span><span><span class='tag'>&lt;</span><span class='tag-name'>column</span><span> </span><span class='attribute'>name</span><span>=</span><span class='attribute-value'>"gzzh"</span><span> </span><span class='attribute'>length</span><span>=</span><span class='attribute-value'>"20"</span><span> </span><span class='tag'>/&gt;</span><span> <br/>
改为<br/>
</span></span><span><span class='tag'>&lt;</span><span class='tag-name'>column</span><span> </span><span class='attribute'>name</span><span>=</span><span class='attribute-value'>"GZZH"</span><span> </span><span class='attribute'>length</span><span>=</span><span class='attribute-value'>"20"</span><span> </span><span class='tag'>/&gt;</span><span> <br/>
sql将变为<br/>
</span></span><span class='postbody'>select this_.id as id2_0_, <font color='#ff00ff'><span style='font-weight: bold;'>this_.GZZH as gzzh2_0_</span></font>, this_.www as www2_0_ from test_user this_<br/>
<br/>
<strong style='background-color: rgb(255, 255, 255);'><font color='#000000' style='background-color: rgb(255, 204, 153);'>但是many-to-one的column如果大小写和外键那个属性的大小写不一样的话,hibernate生成的sql就会出现我B情况下的一个大写的GZZH,一个小写的gzzh  二个字段,从而出现了这个隐含的现象。</font></strong><br/>
在本地已经测试过了,看到console出现的sql我终于可以控制住这个多出来的小尾巴了。happy...<br/>
<br/>
<br/>
我的hibernate映射文件一般都是由工具生成的,而数据库的字段不管大小写都不会影响操作,所以我从不曾注意到这种细节,的确让我想象不到问题原因如此的简单。<br/>
<br/>
Thanks.<br/>
</span>
3 楼 janh 2007-04-17  
你可真行,难道没发现sqr是SQR的小写吗?

肯定是你两个地方写的不一样,产生这样的现象就不奇怪了。
2 楼 moogle 2007-04-17  
谢谢关注我的帖子。

具体情况如下:

A.Test_User(n)--(1)Test_Www
字段gzzh是外键,对应Test_Www的主键
B.Ndzjxx(n)--(1)User
字段sqr是外键,对应User的主键
---------------------------
就是分别对Test_User和Ndzjxx进行最简单的查询
Criteria.forClass(XXXX.class)
criteria.list();
就是这个操作hibernate生成的sql语句如上,但是Ndzjxx的查询多出来了一个字段
1 楼 yb31 2007-04-17  
没看明白
你还是二种分开写吧.把代码贴完整点

相关推荐

    SQL实体生成器远吗

    SQL实体生成器是一种工具,它能自动生成与数据库表结构对应的编程语言中的对象模型,通常在ORM(对象关系映射)框架中使用。这个工具极大地简化了开发过程,避免了手动编写大量的数据访问代码。"SQL实体生成器远吗...

    hibernate

    - **动态SQL生成**:在应用程序启动时,Hibernate会根据配置自动生成SQL语句,而不是通过字节码操作,当更换数据库时,只需更改少量属性即可。 ### 3. Hibernate的使用案例 文档中提供了两个使用Hibernate进行数据...

    Hibernate+jsp+Struts2开发的CRUD和分页代码

    【标题】:“Hibernate+jsp+Struts2开发的CRUD和分页代码”是指使用Java技术栈中的Hibernate对象关系映射框架、Struts2 MVC框架以及JSP(JavaServer Pages)进行基本的数据操作(创建、读取、更新、删除,简称CRUD)...

    s2sh的jar包集合

    Hibernate支持实体类的动态映射,自动处理SQL的生成和执行,同时还提供了丰富的查询API,如HQL(Hibernate Query Language)和Criteria API,使得数据库操作更加便捷。 **4. JDBC14** JDBC(Java Database ...

    毕业论文 任务分配管理系统的设计与实现

    在任务分配系统中,Hibernate负责将Java对象映射到数据库表,实现数据持久化,降低了数据库操作的复杂性,使得开发者可以专注于业务逻辑,而不是繁琐的SQL语句。 JavaScript(js)是客户端脚本语言,用于增强网页的...

    tm-bill.zip

    Mybatis允许开发者直接编写SQL语句,避免了传统的基于JDBC的繁琐操作,同时提供了动态SQL的功能,使得数据库查询更为灵活。 【EasyUI】则是一个基于jQuery的UI库,专为开发Web应用程序而设计。EasyUI提供了丰富的...

    web开发项目:网上购物系统

    2. **Hibernate ORM**:Hibernate是一个对象关系映射(ORM)工具,它简化了数据库操作,使得开发者可以使用面向对象的方式处理数据库事务,无需过多关注SQL语句。在购物系统中,Hibernate用于管理商品、订单、用户等...

    国家电力项目源码.zip

    Hibernate是ORM(Object-Relational Mapping)框架,它消除了Java应用程序与SQL数据库之间的直接交互,将对象模型转换为关系数据库模型。在国家电力项目中,Hibernate可能被用来处理数据持久化,包括实体类的定义、...

    基于web高校网络教学平台答辩ppt(与“学生”相关共15张).pptx

    JSP用于动态网页生成,Servlet处理HTTP请求,而Hibernate则作为对象关系映射(ORM)工具,简化了数据库操作。SQL语言用于数据库的管理和数据交互,确保数据的准确存储和快速查询。 设计这样的网络教学平台,不仅...

    MyBatis中文参考文档

    MyBatis是一款流行的持久化框架,它支持自定义SQL语句、存储过程以及高级映射,能够有效地减少JDBC代码的编写,几乎消除了手动设置参数和获取检索结果的需要。MyBatis的配置灵活,可以用XML或者注解来实现,允许...

    东城大学在线答疑系统

    JPA则是JavaEE提供的对象关系映射工具,用于简化数据库操作,使得开发者无需关注底层SQL语法,而是通过面向对象的方式进行数据操作。JSF是一种用于构建用户界面的MVC(Model-View-Controller)框架,能够帮助快速...

    bbs论坛,Java

    - **Hibernate或MyBatis**:ORM(对象关系映射)框架,简化数据库操作,减少手动编写SQL的繁琐工作。 - **JavaScript和AJAX**:前端交互技术,提升用户体验,如异步加载内容、实时更新等。 4. **用户认证与权限...

    java web网上购物

    - **聊天室或消息系统**:用户可以通过内置的聊天工具与客服人员实时交流,解决购买过程中的疑问。 - **异步通信**:使用Ajax等技术实现无刷新的即时通信,提高交互体验。 8. **安全与认证**: - **HTTPS**:为...

Global site tag (gtag.js) - Google Analytics