0

我有两个具有单向 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 字段实际上是一个 varchar,其值为“typeA:123”(其中 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();

任何想法如何执行上述查询?

提前致谢。

干杯菲利普

4

1 回答 1

0

A 是一个接口,而不是一个实体,所以我认为如果不使用提供者特定的代码,标准的 OneToOne 映射将无法工作 - JPA 只允许映射到 JPA 对象,而不是接口。为此,您需要在映射中指定目标类型,以便它知道“a”只能是 TypeA 实体实例。或者您可以将类型从 A 更改为 TypeA。

EclipseLink 有一个变量 OneToOne 映射概念,用于在此处映射接口:http: //eclipse.org/eclipselink/documentation/2.4/jpa/extensions/a_variableonetoone.htm

我不确定其他提供商有什么等价的。

于 2013-09-20T13:33:27.147 回答