is null 在hibernate中的写法 以及一对一关系的处理

mysql 中 查询字段为 null 的记录,用 is null 匹配,但是在 hibernate 中,is null 或者 = null 都是可以的

 hibernate里还有一种情况,不管是用 is null 还是 = null,都无法查出记录,比如下面这种关系:

一个用户只能有一张卡,一个卡,也只能属于一个用户,就是一对一的关系

一对一分为外键关联和主键关联两种方式,两种区别如下:

 

 

 

 而本次讨论的用户和卡对象采取了外键关联,外键关联需要分一个主次关系,因为先有用户,后面才会有卡(用户是肯定有的,但是用户可以没有卡),所以这里用户作为主表,在子表卡中加一个字段,存储用户的主键,就像上面的球队和地址一样,先有地址,后有球队(地址是肯定存在的,但是这个地址可以没有球队),所以在球队中加了一个地址编号的字段,存储地址的主键。

下面看看两张表:

下面是用户表:

 

 下面是卡表:

 

 

 

 如果想查询没有卡的用户信息,就得判断 UseInfo 的 cardInfo 字段为 null,代码如下:

from UserInfo u where u.cardInfo = null

 但是很明显的是,UseInfo 表中并没有存 CardInfo 的外键,上面的HQL并不能查出任何记录,这时候必须采取表连接的方式查询:

select u from UserInfo u left join u.cardInfo c where c = null

这样子就可以了。

下面贴一下项目里的代码:

    private Query createQuery(Params params) {
        
        StringBuilder recordSql = new StringBuilder();
        
        if (params.isCount) { 
            recordSql.append(" select count(u.id) "); 
        } else {
            recordSql.append(" select u "); 
        }
        
        if (StringUtil.isSelected(params.cardStatus) && CardStatus.NONE == params.cardStatus) {
            recordSql.append(" from UserInfo u left join u.cardInfo c where u.active = true ");
        } else {
            recordSql.append(" from UserInfo u where u.active = true ");
        }
        
        if (StringUtil.isSelected(params.currid)) {
            recordSql.append(" and u.id != :currid ");
        }
        
        if (StringUtil.isSelected(params.name)) {
            recordSql.append(" and (u.fullName like :username or u.userName like :username) ");
        }
        
        if (StringUtil.isSelected(params.orgzCode)) {
            recordSql.append(" and u.organization.orgzCode like :orgzCode ");
        }
        
        if (StringUtil.isSelected(params.cardStatus)) {
            if (CardStatus.NONE == params.cardStatus) {
                recordSql.append(" and c = null ");
//                recordSql.append(" and u.modifiedUser.id = null ");
            } else {
                recordSql.append(" and u.cardInfo.eCardStatus = :cardStatus ");
            }
        }
        
        if (params.useForDoor != null) {
            recordSql.append(" and u.cardInfo.useForDoor = :useForDoor "); 
        }
        
        if (params.userList != null && params.userList.size() > 0) {
            recordSql.append(" and u in :userList "); 
        }
        
        if (params.userStatus != null) {
            recordSql.append(" and u.status = :userStatus "); 
        }
        
        if (!StringUtil.isEmpty(params.cardNumber)) {
            recordSql.append(" and u.cardInfo.cardNumber like :cardNumber ");
        }
        
        if (!params.isCount && params.orderBy != null) {
            recordSql.append(params.orderBy);
        }
        
        Query recordQuery = em.createQuery(recordSql.toString());
        
        if (StringUtil.isSelected(params.currid)) {
            recordQuery.setParameter("currid", params.currid);
        }
        
        if (StringUtil.isSelected(params.name)) {
            recordQuery.setParameter("name", "%" + params.name + "%");
        }
        
        if (StringUtil.isSelected(params.orgzCode)) {
            recordQuery.setParameter("orgzCode", params.orgzCode + "%");
        }
        
        if (StringUtil.isSelected(params.cardStatus)) {
            if (CardStatus.NONE != params.cardStatus) {
                recordQuery.setParameter("cardStatus", params.cardStatus);
            }
        }
        
        if (params.useForDoor != null) {
            recordQuery.setParameter("useForDoor", params.useForDoor);
        }
        
        if (params.userList != null && params.userList.size() > 0) {
            recordQuery.setParameter("userList", params.userList);
        }
        
        if (params.userStatus != null) {
            recordQuery.setParameter("userStatus", params.userStatus);
        }
        
        if (!StringUtil.isEmpty(params.cardNumber)) {
            recordQuery.setParameter("cardNumber", "%" + params.cardNumber + "%");
        }
        
        return recordQuery;
    }

 

posted @ 2020-06-22 17:19  1156740846  阅读(781)  评论(0编辑  收藏  举报