从ibatis转向hibernate后发现hibernate有很多地方实在是无赖,可能是学艺不精! 
我有这样个需求:
select * from A left join B on A.id=b.id and b.id='需要动态传入' order by B.id asc在ibatis实现非常简单,hibernate应为没有on关键字,对如果这个查询做不了的话,是不是对sql支持过于简单? 那他的优势在哪?只是不是限了解sql的初学者使用方便吗? 望请指教!

解决方案 »

  1.   

    hibernate需要做对象之间的关联,不支持on
      

  2.   

    哈哈,hibernate支不支持这种写法我不是很清楚。但通过对象之间的关联要实现楼主的需求hibernate肯定可以做到的。假如A是主表B是子表,设置A到B的一到多映射。然后通过Criteria查询可以轻松做到。
      

  3.   


    这个我知道,但它的关联后只能对关联的那个字段动态生成sql。但我要干预生成的sql后的那个on的条件,如我需求中所说的我要动态干预 (on A.id=b.id and b.id='需要动态传入' ),看了之后没有找到合适的解决方法,
    由于有分页的包装类所以不能使用查询结果中增加伪列的做法。需求:
    select * from A left join B on A.id=b.id and b.id='需要动态传入' order by B.id asc 
      

  4.   

    问题不是在on,而在于LZ不了解HQL语句的语法。hibernate用起来还是挺方便的
      

  5.   

    这个目前看真做不了,left join后只能动态关联m-t-m的那个字段,没法干预on后的and字段,我的需求中的sql是个非常规用法,没关联到的B中的数据会直接接成null。
      

  6.   

    使用hibernate是为了跨平台方便,
    用户编写hql,hibernate根据配置文件中指定的数据库类型转换成sql,
    然后如果你更换了数据库,只需要改一下配置文件中的数据库url以及驱动类名就可以了
    不必重新写sql,利于开发和维护当然你要是觉得hql里没有on不方便,一定想用sql的话,hibernate也支持原生态查询,
    使用session.createSQLQuery(sql)即可
      

  7.   


    新手上路,目前理解hql无法实现 *** left join B on B.1=A.1 and B.1='?'的语法。
      

  8.   

    这是个sql语句吧?用hibernate的SQlQuery
      

  9.   

    不建议使用Criteria查询接口,而应该使用官方推荐的Query查询接口
      

  10.   


    这个我知道,但问题是这样我需要重新写个分页工具,目前分页工具无法支持。我也很无赖,没着只能走重写个了。“hibernate是为了跨平台方便”这个倒是真的,不过项目启动后数据库是不会变的,所谓换数据库都是小项目到处换的那种,我们项目是定制的。
      

  11.   

    非得用左连接吗? 
    用where条件过滤不是一样的吗
      

  12.   

    对! where后加就是内连接。跟需求不一致。我的目的就是看哪些B表里的数据被选中,同时选中的往前排!
      

  13.   

    偶是这个意思:String hql = "from A left join B where A.id=B.id and B.id=?"
      

  14.   

    session.createSQLQuery(hql)
    hibernate我用的时候觉得挺爽的 
      

  15.   


    这个效果就不对了,你可以实现俩种写法的效果。这样写的话结果where后的就是内关联,不能把A表数据全列出后,把B表符合的数据接到A表后面了。
      

  16.   

    不明白为什么会和分页工具有关系,
    但是要达到外连接的目的方法很多,
    hql 有outer join字
    也可以sql: where A.id = b.id(+)
    就算非用 Criteria不可,
    也可以createCriteria(A.class).createCriteria(集合名,名)
    .setFetchMode(xx,FetchMode.xx)设置抓取策略,设置为外连接,
    并且还可以在后面接你那个动态参数,用Restrictions加查询参数,都可以
      

  17.   

    你那个查询我不知道怎么是非常规,如果有a与b对象基于id的的关联,那可以写成:
    from A left join B b and b.id='需要动态传入' order by B.id asc 
      

  18.   

    hql 不支持join on,写原生sql好了
      

  19.   

    看来只能自己写分页,用原生sql了,本部想这么用。hibernate太失望了。在这点上比起ibatis还是很不爽。
      

  20.   

    select * from A a left join B b with a.id=b.id and b.id='需要动态传入' order by b.id asc