hibernate中获取关联属性为null的方式

阅读更多
在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());
    }

你可能感兴趣的:(Hibernate,SQL)