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

本文探讨了在Hibernate中如何正确查询包含空关联属性的实体对象,通过对比不同的查询方式,介绍了使用Restrictions.isNull方法来有效获取那些具有null关联的对象。

在Hibernate中获取有关联关系的pojo。我是指例如一个User(用户)拥有一个many-to-one的属性Unit(单位),但是有时有些用户的Unit属性为空,如果按单位查询用户的时候那些单位为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());
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值