0

本Pro JPA 2のこのコード行を理解するのに少し苦労しています。181ページの本によると.

選択クエリの結果の型をコレクションにすることはできません。エンティティ インスタンスや永続フィールド タイプなどの単一値オブジェクトである必要があります。e.phones などの式は、Collection インスタンスになるため、SELECT 句では使用できません (e.phones の各出現はインスタンスではなくコレクションです)。したがって、SQL やテーブルと同様に、コレクションの関連付けに沿って移動し、そのコレクションの要素を返す場合は、2 つのエンティティを結合する必要があります。

以下のエンティティをリレーションシップ マッピングで検討してください

@Entity
public class Employee {
    ..
    @OneToMany(mappedBy="employee", cascade=CascadeType.ALL, targetEntity=Phone.class)
    private Collection<Phone> phones = new ArrayList<Phone>();
    ..
}
@Entity
public class Phone {
    ..
    @OneToOne 
    private Employee employee;
    ..
}

今、テストクラスで私はこのテストケースでそれを試しました

@Test
public void selectCollectionTest(){
    TypedQuery<Object> query = em.createQuery("select e.phones from Employee e where e.id = 1", Object.class);  
    List<Object> empList = query.getResultList();
    for(Object temp: empList){
        System.out.println(temp);
    }
}

例外がスローされることを期待していましたが、何も起こらず、コレクションを選択できましたか?

これは正しいです?誰かが私の理解を説明または明確にすることができますか?

Eclipselink

4

2 に答える 2

2

EclipseLink ではこれが許可されていますが、これは拡張機能であり、JPA 仕様ではサポートされていません。

クエリと同じですが、

select p from Employee e join e.phones p where e.id = 1
于 2012-05-31T13:38:22.237 に答える
0

where句を削除して、以下のコードでクエリを実行してみてください。

select e.phones from Employee e, Object.class

私がしようとしているポイントは、emp id 1 に含まれる電話オブジェクトが 1 つだけの結果である可能性があります。

于 2012-05-31T12:35:53.523 に答える