目前,hibernate支持在配置文件写hql或原生sql,该功能带来了至少两个优点:
1. 数据库平台的可移植性
2. 数据库sql的调优,通过将所有的sql放到配置文件中,可以在之后遇到性能问题时,专由dba来进行性能调优。在java中写sql、hql、或criteria都不能方便调优。基于以上两个原因,我在自己的项目中总是把sql语句放到hbm文件中,但发现了下面两个问题:
1. 通过配置文件写sql,是否支持动态sql?若不支持,有没有什么更好的办法,来解决这个问题,又不丧失上面两个优点?   解释:多条件查询(查询条件多个,但可选)时,不能像ibatis那样通过在sql配置文件中判断某个参数是否传过来来动态的构造sql(hql)。
   举例如下:
   有一个查询,页面查询条件是用户名输入框,查询时可为空,在配置文件中我通过如下语句:
   select * from user t where t.username=decode(:username,null,t.username,:username)
   来查询,如果页面没有输入用户名,则相当于调用select * from user t where t.username=username了,username=username相当于1=1,
   但在查询时又过滤这个条件,这造成了性能低下,若条件多个,性能甚是堪忧。   针对这种情况,不知哪位朋友有更好的解决方案,望不吝告知2. 通过配置文件写sql,在查询条件包含in(...)时,并且传过来的in内部参数个数无法确定时,该如何写sql?或有没有更好的解决方案?望高手回答,若能解决再送30分

解决方案 »

  1.   

    不知道解决的办法。
    一般情况下,你如果很喜欢写sql,用iBATIS算了。而写hql的话,老实说调优是很没必要的,至于移植,笑谈而已。
    hibernate的配置文件里写sql,一般只用于调用存储过程。楼主走火入魔了。
      

  2.   

    一楼楼主缺乏项目经验吧,这可以理解,但请不要不懂装懂,胡言乱语,大放厥词。
       我两年前做的一个产品就有数据库移植的需求,卖给山东时用oracle,卖给河南时用的db2,而且后期hql的调优还起了很大作用,我把sql写在配置文件另一个很大的原因还在于这样在dao里少了不少重复啰嗦的的sql判断处理语句,大大减少了代码的编写,甚至可以不要dao,只写一个通用的dao就可以了。正因为有这个项目经历,我才这样做的。学习交流要谦虚礼让,相互尊敬,系望一楼谨记。另请高人指教