0

一方向の OneToOne 関係を持つ 2 つのクラスがあります。

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

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

    .....
}

これらのクラスを保存すると、すべて正常に動作します。ここで、既存の A に基づいて Other を取得したいと思います。基本的に「SELECT * FROM OTHERE WHERE a = :a」と言う CriteriaQuery を作成しました。しかし、タイプ 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();

上記のクエリを実行する方法はありますか?

前もって感謝します。

乾杯フィリップ

4

1 に答える 1

0

A はエンティティではなくインターフェイスであるため、プロバイダー固有のコードを使用しないと標準の OneToOne マッピングが機能しないと思います。JPA では、インターフェイスではなく、JPA オブジェクトへのマッピングのみが許可されます。これを機能させるには、マッピングでターゲット タイプを指定して、「a」が TypeA エンティティ インスタンスにしかできないことを認識させる必要があります。または、タイプを A から TypeA に変更することもできます。

EclipseLink には、ここでインターフェイスをマップするために使用される可変の OneToOne マッピングの概念があります

他のプロバイダーが同等のものを持っているかどうかはわかりません。

于 2013-09-20T13:33:27.147 に答える