hql left join on應用問題

 網摘一:


sql: select c.* from card c left join score s on s.card_id = c.id and s.invalid_date >=curdate() where s.id is null
在hibernate中要使用left join必須聲明關聯映射,這裏的關聯是one-to-many, 在Card裏面建一個Set scores,然後配置好
        <set name="scores" cascade="none" where="valid_date >= curdate()">
              <key column="CARD_ID"/>
              <one-to-many class="Score" />
        </set>
唯一特殊的就在於這個where,hql裏面不能寫on ,所以得on裏面的條件都寫在where裏面,where裏面是寫的是字段名和針對不同數據庫的sql,將導致不同數據庫之間的移植增加一些工作量。
hql如下:select c from Card c left join c.scores s  where s.id is null

問題是:在set中配置的key不是另外表的關鍵字,條件也不需要用到key,又該如何用呢?目前出現的就是這個問題,哎,找不到解決辦法,問題先記錄下來吧。有時間再看看

網摘之二:
有2個Table:Parent、Children。  
  Parent結構:id(int),   name(string)。主鍵id。  
  Children結構:parentid(int),   type(int),   name(string)。主鍵parentid,   type。  
  Children.parentid和Parent.id連接
SQL可寫爲SELECT   *   FROM   Parent   LEFT   OUTER   JOIN   Children   ON   Parent.id=Children.parentid   AND   Children.type=?或SELECT   *   FROM   Parent   LEFT   OUTER   JOIN   (SELECT   *   FROM   Children   WHERE   type=?)   ON   Parent.id=Children.parentid
<class>  
  ....  
  <set   name="children"   inverse="true"   >  
      <key   column="parent_Id"   />  
      <one-to-many   class="Parent"   />  
      <filter   name="typefilter"   />  
  </set>  
  </class>  
   
  <filter-def   name="typefilter"   condition="type=:type"   >  
                  <filter-param   name="type"   type="string"   />  
  </filter-def>  
   
   
  session.enableFilter("typefilter").setParameter("type","xxxxxxxx");  
  List   list=session.createQuery("select   p   from   Parent   p   left   join   p.children   c").list();

問題是我的DB訪問層用的是 SimpleHibernateTemplate,這裏的Filter就知道如何用了

對hql不是很熟,一個問題的記錄而已。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章