我有两个具有单向OneToOne关系的类:
@Entity
@Table(name = "TypeA")
public class TypeA implements A
{
...
}
@Entity
@Table(name = "OTHER")
public class Other
{
@OneToOne
private A a;
.....
}
当我保存这些类时,一切正常。现在我想根据现有的A.检索Other。我创建了一个CriteriaQuery,基本上说“SELECT * FROM OTHERE WHERE a =:a”。但是当我在查询中设置类型A的对象时,它将失败。查看数据库,我可以看到OTHER.A字段实际上是一个值为“typeA:123”的varchar(其中123是A对象的ID)。不幸的是,我不能在这里使用双向映射。
final CriteriaBuilder cb = em.getCriteriaBuilder();
final CriteriaQuery<Other> cq = criteriaBuilder.createQuery(Other.class);
final Root<Other> root = cq.from(Other.class);
cq.where(cb.equal(root.get(Other_.a), myActualAObject));
final TypedQuery<Other> tq = em.createQuery(cq);
final Other other = tq.getSingleResult();
如何执行上述查询的任何想法?
提前致谢。
干杯 菲利普
答案 0 :(得分:0)
A是一个接口,而不是一个实体,所以我不认为标准的OneToOne映射可以在不使用提供者特定代码的情况下工作 - JPA只允许映射到JPA对象,而不是接口。为此,您需要在映射中指定目标类型,以便它知道'a'只能是TypeA实体实例。或者您可以将类型从A更改为TypeA。
EclipseLink有一个变量OneToOne映射概念,用于映射接口: http://eclipse.org/eclipselink/documentation/2.4/jpa/extensions/a_variableonetoone.htm
我不确定其他提供商是否具有同等效力。