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; }