今天用hibernate做了一个一对一双向关系,在生成含is null的hql语句时,发现不能正确判空,内牛满面,请各位帮忙看看问题所在。
这是一个简单的一对一双向关联,一个项目经理(Manager)可以关联一个登陆用户(User)(可以为空,表示暂无用户关联此项目经理)。数据库中 由_manager表来维护外键userId.pojo如下:
@Entity
@Table(name = "_user")
public class User { private int userId;
private String userName;
private String password;
//高级管理 、系统管理、业主 
//分 部门管理员,部门经理,项目经理,高级管理员,系统管理员,业主 六种类型
private String roleType;
private OwnerPower ownerPower;//业主有此属性
private Department department; //部门经理\部门管理员 都有部门属性
private Manager manager;//项目经理 有此属性

@Id
@GeneratedValue
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getRoleType() {
return roleType;
}
public void setRoleType(String roleType) {
this.roleType = roleType;
}
@OneToOne(cascade={CascadeType.PERSIST,CascadeType.REMOVE})
@JoinColumn(name="ownerPowerId",unique=true)
public OwnerPower getOwnerPower() {
return ownerPower;
}
public void setOwnerPower(OwnerPower ownerPower) {
this.ownerPower = ownerPower;
}
@ManyToOne(cascade={CascadeType.PERSIST})
@JoinColumn(name="depId")
public Department getDepartment() {
return department;
}
public void setDepartment(Department department) {
this.department = department;
}
@OneToOne(mappedBy = "user")
public Manager getManager() {
return manager;
}
public void setManager(Manager manager) {
this.manager = manager;
}
}
@Entity
@Table(name = "_manager")
public class Manager {
int managerId;
String name;
Department department;
User user;

@Id
@GeneratedValue
public int getManagerId() {
return managerId;
}
public void setManagerId(int managerId) {
this.managerId = managerId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@ManyToOne(cascade={CascadeType.ALL})
@JoinColumn(name="depId")
public Department getDepartment() {
return department;
}
public void setDepartment(Department department) {
this.department = department;
}
@OneToOne(cascade={CascadeType.PERSIST})
@JoinColumn(name="userId",unique=true)
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}做的查询如下: //查询未关联项目经理的项目经理角色用户
List<User> ulist =  userDao.find("from User u where u.roleType='项目经理' " +
"and u.manager is null");
List<User> ulist1 = userDao.find("from User u where u.roleType='项目经理' " +
"and u.manager.managerId="+managerId);前一句生成的sql语句凌乱了,居然做is null 判断会生成红色的条件:
Hibernate: select user0_.userId as userId5_, user0_.depId as depId5_, user0_.ownerPowerId as ownerPow6_5_, user0_.password as password5_, user0_.roleType as roleType5_, user0_.userName as userName5_ from _user user0_ where user0_.roleType='项目经理' and (user0_.userId is null)
后一句则很正常的生成了表连接语句,说明数据库和配置应该是无误的:
Hibernate: select user0_.userId as userId5_, user0_.depId as depId5_, user0_.ownerPowerId as ownerPow6_5_, user0_.password as password5_, user0_.roleType as roleType5_, user0_.userName as userName5_ from _user user0_, _manager manager1_ where user0_.userId=manager1_.userId and user0_.roleType='项目经理' and manager1_.managerId=0为何呢求教无语问苍天Hibernate