在Hibernate中獲取有關聯關系的pojo。我是指例如一個User(用戶)擁有一個many-to-one的屬性Unit(單位),但是有時有些用戶的Unit屬性為空,如果按單位查詢用戶的時候那些單位為null的用戶就會被遺漏,如何調取呢?這本來是很簡單的,但是我想當然的使用了Restriction.eq,但是不行,后來看了手冊才發現應該使用Restrictions.isNul。下面是Test代碼...

????/**?*//**
?????*?為了獲取一個unit為null的用戶,如果傳入一個null作為Uint實例則返回的結果總是0
?????*?因為執行的SQL為:(select?*?)?from?USER_INF?this_?where?this_.UNIT_ID=''
?????*?這不是我們所期望的結果
?????*/
????@Test

????public?void?getUsersWhosUnitIsNullByRestrictionsEqNullUnit()?
{
????????DetachedCriteria?dc?=?DetachedCriteria.forClass(User.class);
????????dc.add(Restrictions.eq("unit",?null));

????????Criteria?cri?=?dc.getExecutableCriteria(session);
????????log.debug("getUsersWhosUnitIsNullByRestrictionsEqNullUnit():"?+?cri.list().size());
????}
????

????/**?*//**
?????*?為了獲取一個unit為null的用戶,如果傳入一個id為null的Unit實例則會報錯,無法翻譯為SQL
?????*?錯誤類型為:org.hibernate.TransientObjectException
?????*?這也不是我們所期望的結果
?????*/
????@Ignore
????@Test(expected=TransientObjectException.class)

????public?void?getUsersWhosUnitIsNullByRestrictionsEqUnitNullId()?
{
????????Unit?unit?=?new?Unit();
????????log.debug(unit.getId());
????????DetachedCriteria?dc?=?DetachedCriteria.forClass(User.class);
????????dc.add(Restrictions.eq("unit",?unit));

????????Criteria?cri?=?dc.getExecutableCriteria(session);
????????log.debug("getUsersWhosUnitIsNull():"?+?cri.list().size());
????}


????/**?*//**
?????*?為了獲取一個unit為null的用戶正確的方法應該是使用Restrictions.isNull方法
?????*?因為執行的SQL為:(select?*?)?from?USER_INF?this_?where?this_.UNIT_ID?is?null
?????*?這才是我們所希望的結果
?????*/
????@Test

????public?void?getUsersWhosUnitIsNullByRestrictionsIsNull()?
{
????????DetachedCriteria?dc?=?DetachedCriteria.forClass(User.class);
????????dc.add(Restrictions.isNull("unit"));

????????Criteria?cri?=?dc.getExecutableCriteria(session);
????????log.debug("getUsersWhosUnitIsNullByRestrictionsIsNull():"?+?cri.list().size());
????}




















































