Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA:查询与抽象类的OneToOne关系_Java_Jpa - Fatal编程技术网

Java JPA:查询与抽象类的OneToOne关系

Java JPA:查询与抽象类的OneToOne关系,java,jpa,Java,Jpa,我有两个类,它们具有单向的一对一关系: @Entity @Table(name = "TypeA") public class TypeA implements A { ... } @Entity @Table(name = "OTHER") public class Other { @OneToOne private A a; ..... } 当我保存这些类时,一切正常。现在我想根据现有的A检索另一个。我创建了一个CriteriaQuery,基本上说是“从

我有两个类,它们具有单向的一对一关系:

@Entity
@Table(name = "TypeA")
public class TypeA implements A
{
    ...
}

@Entity
@Table(name = "OTHER")
public class Other
{
    @OneToOne
    private A a;

    .....
}
当我保存这些类时,一切正常。现在我想根据现有的A检索另一个。我创建了一个CriteriaQuery,基本上说是“从OTHERE中选择*,其中A=:A”。但是,当我在查询中设置A类型的对象时,它将失败。查看数据库,我可以看到另一个字段实际上是一个varchar,值为“typeA:123”(其中123是A-object的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();
final CriteriaBuilder cb=em.getCriteriaBuilder();
final CriteriaQuery cq=criteriaBuilder.createQuery(Other.class);
最终根=cq.from(其他类);
cq.where(cb.equal(root.get(Other_uu.a),MyActualObject));
最终类型DQuery tq=em.createQuery(cq);
最终其他=tq.getSingleResult();
你知道如何执行上面提到的查询吗

提前谢谢

干杯
Philipp

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

EclipseLink有一个可变的OneToOne映射概念,用于映射此处的接口:

我不确定其他供应商有哪些是等效的