关于hibernate查询的配置问题
我对hibernate关于把sql或hql写到配置文件中一直有两个疑问:
1. 对于每一个复杂的原生sql查询,
如
<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)才能保证返回正确的结果集。
请问以上两个问题该如何解决?每题10分,望高人解答!!