0

条件付きの日食リンクに参加する方法がわかりません。これは私の実体です:

public class A implements Serializable {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Basic(optional = false)
  @Column(name = "id")
  private Long id;
  @Column(name = "value")
  private String value;   

  @OneToMany(mappedBy = "aid")
  private Collection<B> bCollection; 
}

public class B implements Serializable {

  @Id      
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Basic(optional = false)
  @Column(name = "id")
  private Long id;

  @JoinColumn(name = "a_id", referencedColumnName = "id")
  @ManyToOne
  private A aid;  
}

私はこれをします:

    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery cq = cb.createQuery();
    Root<A> a = cq.from(A.class);
    Join<A, B> j = a.join("aid",JoinType.INNER);
    cq.distinct(true);
    //and now what?        
    cq.where(cb.equal(a.get("id"), "aid"));
    Object r = em.createQuery(cq).getResultList();

では、join句をCriteriaQueryにバインドするにはどうすればよいですか?

4

2 に答える 2

1

最初に、A と B のすべてのフィールドを含む結果リストを取得するには、結果を のリストTupleまたは のリストとして整形する必要があります (Objectこの記事(チャプター結果の射影) で説明されているように)。

これには、複数選択ステートメントを使用する、次のような構造を使用する必要があります。

cq.multiselect(a, b));
cq.select(cb.construct(a, b));

b は次のように取得する必要があります。

CollectionJoin<A, B> b = a.join(A_.bCollection, JoinType.INNER);  // using Metamodel
于 2012-10-23T15:29:16.750 に答える
0

「Aからaを選択ajoina.bCollection」だけが必要で、Bと同様にのみが返される場合、必要なのは次のとおりです。

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery cq = cb.createQuery();
Root<A> a = cq.from(A.class);
Join<A, B> j = a.join("bcollection",JoinType.INNER);
cq.distinct(true);
Object r = em.createQuery(cq).getResultList();

JPAは、Bのaid属性で定義された関係を使用して、A-> Bテーブル結合を作成するため、作成する必要はありません。bCollectionマッピングでデフォルトのフェッチタイプを使用しているため、Bが遅延フェッチされる可能性があることを除いて、返されたAは完全になります。それらを熱心に取り込み、単一のクエリでAsに関連付けたい場合は、結合の代わりにフェッチメソッドを使用します。

a.fetch("bcollection",JoinType.INNER);
于 2012-10-23T18:51:27.170 に答える