复合 Id 的休眠条件
hibernate Criteria on Composite Id
下面是与我遇到问题的代码非常相似的相同代码
//mapped to Table B
class B implements Serializable {
//Primary key bId
private Long bId;
//Getter and setter for bId;
}
//Mapped to table C
class C implements Serializable {
//Primary key bId
private Long cId;
//Getter and setter for cId;
}
//mapped to Table A (Which has composite key fBid and fCid)
class A{
//Composite primary key
private B bid;
private C cid;
//getter and setter for B and C
//Other fields
}
如果我要创建如下标准:-
B b = new B();
b.setBId(1l);
C c = new C();
c.setCId(2l);
Criteria criteria = getSessionFactory().getCurrentSession().createCriteria(A.class,"a");
criteria.add(Restrictions.eq("a.bid", b));
criteria.add(Restrictions.eq("a.cid",c));
A result = (A) criteria.uniqueResult();
return result;
我低于异常
org.postgresql.util.PSQLException:错误:运算符不存在:integer = bytea
甚至我创建了一个单独的 class BC,它具有 B 和 C class 的对象,并在 class A 中使用它作为复合键。然后做了一个
Criteria criteria = getSessionFactory().getCurrentSession().createCriteria(A.class,"a");
criteria.add(Restrictions.eq("a.BC", bc));
A result = (A) criteria.uniqueResult();
return result;
还是一样的错误
任何帮助将不胜感激。
注意:- 我正在为所有 classes 做休眠 xml 映射。
我找到的解决方案
更改了 class A,如下所示:-
class A{
private BC bc;
//getter and setter
}
where BC
class BC{
private B b;
Private C c;
//getter and setters
}
Criteria criteria = getSessionFactory().getCurrentSession().createCriteria(A.class,"a");
criteria.add(Restrictions.eq("bc.b", b));
criteria.add(Restrictions.eq("bc.c",c));
A result = (A) criteria.uniqueResult();
return result;
错误表明,您正在尝试比较 2 个不同的事物。 "a.bc" 将 return blob 对象,java 中的 bc
将为您提供实际的指针值。您可以使用
更改限制
criteria.add(Restrictions.eq("a.bId.bId", b.bId));
criteria.add(Restrictions.eq("a.cid.cId",c.cId));
请注意,这会起作用,因为您定义条件 Class
createCriteria(A.class,"a")
所以 "a" 将是 A Class
的别名
有关更多信息,请查看此 answer
下面是与我遇到问题的代码非常相似的相同代码
//mapped to Table B
class B implements Serializable {
//Primary key bId
private Long bId;
//Getter and setter for bId;
}
//Mapped to table C
class C implements Serializable {
//Primary key bId
private Long cId;
//Getter and setter for cId;
}
//mapped to Table A (Which has composite key fBid and fCid)
class A{
//Composite primary key
private B bid;
private C cid;
//getter and setter for B and C
//Other fields
}
如果我要创建如下标准:-
B b = new B();
b.setBId(1l);
C c = new C();
c.setCId(2l);
Criteria criteria = getSessionFactory().getCurrentSession().createCriteria(A.class,"a");
criteria.add(Restrictions.eq("a.bid", b));
criteria.add(Restrictions.eq("a.cid",c));
A result = (A) criteria.uniqueResult();
return result;
我低于异常
org.postgresql.util.PSQLException:错误:运算符不存在:integer = bytea
甚至我创建了一个单独的 class BC,它具有 B 和 C class 的对象,并在 class A 中使用它作为复合键。然后做了一个
Criteria criteria = getSessionFactory().getCurrentSession().createCriteria(A.class,"a");
criteria.add(Restrictions.eq("a.BC", bc));
A result = (A) criteria.uniqueResult();
return result;
还是一样的错误
任何帮助将不胜感激。
注意:- 我正在为所有 classes 做休眠 xml 映射。
我找到的解决方案 更改了 class A,如下所示:-
class A{
private BC bc;
//getter and setter
}
where BC
class BC{
private B b;
Private C c;
//getter and setters
}
Criteria criteria = getSessionFactory().getCurrentSession().createCriteria(A.class,"a");
criteria.add(Restrictions.eq("bc.b", b));
criteria.add(Restrictions.eq("bc.c",c));
A result = (A) criteria.uniqueResult();
return result;
错误表明,您正在尝试比较 2 个不同的事物。 "a.bc" 将 return blob 对象,java 中的 bc
将为您提供实际的指针值。您可以使用
criteria.add(Restrictions.eq("a.bId.bId", b.bId));
criteria.add(Restrictions.eq("a.cid.cId",c.cId));
请注意,这会起作用,因为您定义条件 Class
createCriteria(A.class,"a")
所以 "a" 将是 A Class
有关更多信息,请查看此 answer