论坛首页 Java企业应用论坛

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

浏览 5109 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-04-17  
  惟一外键关键的情况(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,

   发表时间:2007-04-17  
没看明白
你还是二种分开写吧.把代码贴完整点
0 请登录后投票
   发表时间: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的查询多出来了一个字段
0 请登录后投票
   发表时间:2007-04-17  
你可真行,难道没发现sqr是SQR的小写吗?

肯定是你两个地方写的不一样,产生这样的现象就不奇怪了。
0 请登录后投票
   发表时间:2007-04-17  
多谢janh提醒。我测试了一下终于发现:

xml 代码
 
  1. <property name="gzzh" type="java.lang.String">    
  2.              <column name="gzzh" length="20" />    
  3.  <!---->property>   
  4.  <many-to-one name="wnote" class="test.db.Www" column="gzzh" lazy="false" update="false" insert="false"/>  
Hibernate生成的sql
select this_.id as id2_0_, this_.gzzh as gzzh2_0_, this_.www as www2_0_ from test_user this_

如果将
<column name="gzzh" length="20" />
改为
<column name="GZZH" length="20" />
sql将变为
select this_.id as id2_0_, this_.GZZH as gzzh2_0_, this_.www as www2_0_ from test_user this_

但是many-to-one的column如果大小写和外键那个属性的大小写不一样的话,hibernate生成的sql就会出现我B情况下的一个大写的GZZH,一个小写的gzzh  二个字段,从而出现了这个隐含的现象。
在本地已经测试过了,看到console出现的sql我终于可以控制住这个多出来的小尾巴了。happy...


我的hibernate映射文件一般都是由工具生成的,而数据库的字段不管大小写都不会影响操作,所以我从不曾注意到这种细节,的确让我想象不到问题原因如此的简单。

Thanks.
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics