【问题标题】:hibernate Criteria on Composite Id组合 ID 的休眠条件
【发布时间】:2016-08-18 09:00:35
【问题描述】:

下面是与我遇到问题的代码非常相似的相同代码

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

还是一样的错误

任何帮助将不胜感激。

注意:- 我正在为所有类做休眠 xml 映射。



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

【问题讨论】:

  • 以下解决方案对我有用

标签: hibernate hibernate-mapping hibernate-criteria composite-id


【解决方案1】:

错误表明您正在尝试比较 2 个不同的事物。 "a.bc" 将返回 blob 对象,而 java 内部的 bc 将为您提供实际的指针值。您可以使用

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

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

欲了解更多信息,请查看answer

【讨论】:

  • 它没有那样工作......我必须从 A 中删除 B 和 C 的实例,而是必须使它们成为 java.lang.Long (以前是 java.abc.B 和java.abc.C)
  • 我会用可行的解决方案更新我的答案。希望你能看看。
猜你喜欢
  • 2011-06-17
  • 1970-01-01
  • 1970-01-01
  • 2011-02-25
  • 2011-12-02
  • 1970-01-01
  • 2011-02-16
  • 2011-07-03
  • 1970-01-01
相关资源
最近更新 更多