網摘一:
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不是很熟,一個問題的記錄而已。