我对hibernate关于把sql或hql写到配置文件中一直有两个疑问:
1. 对于每一个复杂的自定义查询,

<sql-query name="...">
   <return alias="com.xxx.ObjBean">
     <return-property name="xh" column="t_xh"/>
     <return-property name="name" column="t_name"/>
     ...
   </return>
   <![CDATA[
      select a.t_xh,b.t_name
      from a,
      (select ....) as b
      where a.id=b.fid
      ...
   ]]>
</sql-query>以上只是一个例子,如果把结果集映射到一个bean ObjBean里,那么就必须ObjBean创建映射文件,而该bean实际上并没有对应的物理表。请问能否不创建映射文件?另外创建映射文件的最大的一个问题就是还得为这个bean生成一个主键,但返回的查询结果中没有能唯一确定一条记录的字段,在ObjBean的映射文件中用<id ...><gengerator class="uuid.hex"></id>中会报告错误。2. 当查询语句的条件为动态条件时,据我所知,当写到hibernate的配置文件时,hibernate语句并没有判断条件是否为空的语法。

<sql-query>
  select ...
  from ...
  where ..
  if user!='' then
  and username=:user
  end if  if pwd!='' then
  and username=:pwd
  end if</sql-query>
不知道hibernate中有没有类似以上的解决方法(ibaits有)
我在项目的开发过程中只能用decode语句来解决这类问题
and a.username = decode(:user,null,a.username,:user)
但这个问题带来了没必要的查询条件a.username=a.username,当可选条件很多时,严重影响查询性能,
而且如果数据库是oracle的话,如果username字段为空,则a.username=a.username相当于null=null,
这个比较在oracle中并不成立,这样就不会返回结果集。只能改为
and nvl(a.username,'1') = decode(:user,null,nvl(a.username,'1'),:user)才能保证返回正确的结果集。请问以上两个问题该如何解决?高分求教!

解决方案 »

  1.   

    1.动态查询结果集不一定需要配置返回类型吧。建议写在.properties里面。再调用key
    2.一样的。这样的sql可以使用原始sql,不要使用hql了。
      

  2.   

    2楼情仔细看我提的是什么问题再做回答。1.动态查询结果集不一定需要配置返回类型吧。建议写在.properties里面。再调用key 
    我只是举了一个例子2.一样的。这样的sql可以使用原始sql,不要使用hql了。
    第二个问题跟是用原始sql还是hql无关