复合ID

时间:2016-08-18 09:00:36

标签: hibernate hibernate-mapping hibernate-criteria 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

甚至我创建了一个单独的BC类,它具有B和C类的对象,并在A类中用作复合键。然后做了一个

 Criteria criteria = getSessionFactory().getCurrentSession().createCriteria(A.class,"a");
            criteria.add(Restrictions.eq("a.BC", bc));
            A result = (A) criteria.uniqueResult();
            return result;

仍然是同样的错误

任何帮助将不胜感激。

注意: - 我正在为所有类进行hibernate xml maping。

我找到的解决方案 改变了类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;

1 个答案:

答案 0 :(得分:0)

错误表明您正在尝试比较两种不同的东西。 " a.bc"将返回blob对象,java中的bc将为您提供实际的指针值。您可以使用

更改限制
criteria.add(Restrictions.eq("a.bId.bId", b.bId));
criteria.add(Restrictions.eq("a.cid.cId",c.cId));

请注意,这将起作用,因为您正在定义Criteria Class createCriteria(A.class,"a") 所以" a"将是A Class

的别名

有关详细信息,请查看此answer