1

JPA (TopLink) を使用して構築したモデルから生成された SQL に問題があります。

@Entity
@Table(name = "T_TEST_A")
@Access(AccessType.FIELD)
public class TTestA implements Serializable {

@Id
@Column(name = "A_ID")
private String id;

@OneToOne
@PrimaryKeyJoinColumn
private D detail;


@OneToMany()
@JoinTable(name = "T_TEST_JOIN", joinColumns = @JoinColumn(name = "TABLE_FK"),    inverseJoinColumns = @JoinColumn(name = "B_ID"))
private List<B> childrens;
...
}

@Entity
@Table(name = "T_TEST_B")
@Access(AccessType.FIELD)
public class TTestB implements Serializable {

@Id
@Column(name = "B_ID")
private String id;

@OneToOne
@PrimaryKeyJoinColumn
private D detail;
...
}

@Entity
@Table(name = "T_TEST_D")
@Access(AccessType.FIELD)
public class D implements Serializable {

@Id
@Column(name = "D_ID")
private String id;

@OneToOne
@PrimaryKeyJoinColumn
private M moreDetail;
...
}

これは基本的に、3 つのテーブルの関係を使用した 1 対多です。Criteria API を使用すると、最初のレベルとすべての 1 対 1 の関係 (カスケード) と A からの子、つまり A=>D=>M をフェッチを使用して単一の SQL で取得できますが、できません。 t 子 B=>D=>M を同じように動作させます。

私は、A、D、M、および B を取得する SQL クエリになりますが、B=>D=>M を取得する複数のクエリになります。

これが私がすることです:

    final CriteriaBuilder cb = em.getCriteriaBuilder();
    final CriteriaQuery<A> c = cb.createQuery(A.class);
    final Root<A> a = c.from(A.class);
    a.fetch(A_.details).fetch(D_.modeDetails);
    a.fetch(A_.childrens);

    ...

子供たちの呼び出しも「複合」することは可能ですか?

4

1 に答える 1