Person类和User类一一对应,映射关系如下
private User user;@OneToOne(cascade={CascadeType.ALL}, mappedBy="person")
public User getUser() {
return user;
}
private Person person;@OneToOne()
@JoinColumn(name="personid")
public Person getPerson() {
return person;
}我想从person中查询还未配上User的person列表String hql = "from Person as p where p.user is null";可是没实现我要的结果,myeclipse后台输出的hibernate语句是的后半部分是from Person person0_ where person0_.id is not null怎么会是 person0_.id is not null,怎么就给变成 person0_.id呢,我要怎么写才能实现我要的功能
private User user;@OneToOne(cascade={CascadeType.ALL}, mappedBy="person")
public User getUser() {
return user;
}
private Person person;@OneToOne()
@JoinColumn(name="personid")
public Person getPerson() {
return person;
}我想从person中查询还未配上User的person列表String hql = "from Person as p where p.user is null";可是没实现我要的结果,myeclipse后台输出的hibernate语句是的后半部分是from Person person0_ where person0_.id is not null怎么会是 person0_.id is not null,怎么就给变成 person0_.id呢,我要怎么写才能实现我要的功能
你想查询User对象的其他属性 可以用
String hql = "from Person as p where p.user.* is null";
* --代表的是任意属性
我试了下你说的,出现提示:ERROR PARSER:56 - line 1:94: expecting IDENT, found '*'
public User getUser() {
return user;
}如果反过来,我要查的是User中person为空的所有User,写的是"from User as u where u.person is null"
那么控制台的hibernate语句就会是:from User user0_ where user0_.personid is not nul,就会实现要的结果(没去试,不过之前都是这样写的,都可以实现)
我在想是不是因为person类是控制端的原因,person的数据库中没有userid字段,而user的数据库中有personid,所以我那样写是不会实现的,我应该怎么写
List cats = session.createCriteria(Person.class)
.add(Restrictions.isNull("user"))
.list();
照你的形容你这个一对一映射应该是基于外键的,presonid作为user中的外键,但是你的注释是基于主键的一一映射。
我也不确定了,因为我都是用XML配置的,不知道这个注释和XML是不是一样的,XML中用many-to-one +unique来配置主键作为其他表外键的部分。其实你可以直接用SQL的,Hibernate不是有SQLQuery嘛。。
试下这个吧
其它的语句都没问题,就只有这条查不出,是不好使,可以输出所有user下的person
from Person as p left join p.user as u where u is null.
hibernate默认情况下对关联属性的查询是采用inner join策略,因此
from Person as p where p.user is null 语句是查不到user属性为空的person对象的!