親と子の両方に追加の制約条件が設定されている親子関係を設定してから@JoinFetchを使用すると、子追加の条件が無視されます。eclipselink子クラスでAdditionalCriteriaが無視されました
TableA.java:
@javax.persistence.Entity
@Table(name = "TABLE_A")
@AdditionalCriteria("this.tableAfield2=:propA")
public class TableA {
@Id
@Column(name = "TABLEAFIELD1")
private String tableAfield1;
@Column(name = "TABLEAFIELD2")
private String tableAfield2;
@JoinColumn(name = "TABLEAFIELD2", referencedColumnName = "TABLEBFIELD1", insertable = false, updatable = false)
@OneToOne(fetch = FetchType.EAGER)
// @JoinFetch(JoinFetchType.OUTER)
private TableB tableAtableB;
}
TableB.java:
@javax.persistence.Entity
@Table(name = "TABLE_B")
@AdditionalCriteria("this.tableBfield2=:propB")
public class TableB {
@Id
@Column(name = "TABLEBFIELD1")
private String tableBfield1;
@Column(name = "TABLEBFIELD2")
private String tableBfield2;
public String getTableBfield1() {
return tableBfield1;
}
public String getTableBfield2() {
return tableBfield2;
}
}
メイン:例えば
例に従って設定にtableAで
em.setProperty("propA", "propertyAValue");
em.setProperty("propB", "propertyBValue");
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<TableA> criteriaQuery = cb.createQuery(TableA.class);
Root<TableA> tableA = criteriaQuery.from(TableA.class);
Predicate pred = cb.equal(tableA.get("tableAfield1"), "keyA1");
criteriaQuery.where(pred);
List<TableA> results = em.createQuery(criteriaQuery).getResultList();
( JoinFetchがコメントアウトされている) のアプリケーションのEclipseLinkは、オンデマンドtable_bをロードしているように、微細である2つのSQL文
SELECT TABLEAFIELD1, TABLEAFIELD2 FROM TABLE_A WHERE ((TABLEAFIELD1 = ?) AND (TABLEAFIELD2 = ?))
bind => [keyA1, propertyAValue]
SELECT TABLEBFIELD1, TABLEBFIELD2 FROM TABLE_B WHERE ((TABLEBFIELD1 = ?) AND (TABLEBFIELD2 = ?))
bind => [propertyAValue, propertyBValue]
を作成します。
私たちのアプリケーションでは、おそらく1000sの行があり、単一の結合が必要なので、単一のSQLを持つ必要があります。
したがって、@ JoinFetchを戻すと、生成されるSQLは次のようになります。
SELECT t1.TABLEAFIELD1, t1.TABLEAFIELD2, t0.TABLEBFIELD1, t0.TABLEBFIELD2 FROM TABLE_A t1 LEFT OUTER JOIN TABLE_B t0 ON (t0.TABLEBFIELD1 = t1.TABLEAFIELD2) WHERE ((t1.TABLEAFIELD1 = ?) AND (t1.TABLEAFIELD2 = ?))
bind => [keyA1, propertyAValue]
TableBのからadditionalCriteriaが追加されていない(存在していないt0.tableBField1 =?(propertyBValue))
任意の提案は?それは私を怒らせる。ここでは完全を期すために
感謝
はテーブル
create table TABLE_A (
TABLEAFIELD1 varchar2(20),
TABLEAFIELD2 varchar2(30),
CONSTRAINT tableApk PRIMARY KEY (TABLEAFIELD1)
) ;
create table TABLE_B (
TABLEBFIELD1 varchar2(20),
TABLEBFIELD2 varchar2(30),
CONSTRAINT tableBpk PRIMARY KEY (TABLEBFIELD1)
) ;
insert into TABLE_A (TABLEAFIELD1,TABLEAFIELD2) values ('keyA1','propertyAValue');
insert into TABLE_A (TABLEAFIELD1,TABLEAFIELD2) values ('keyA2','propertyAValue');
insert into TABLE_A (TABLEAFIELD1,TABLEAFIELD2) values ('keyA3','random');
insert into TABLE_B (TABLEBFIELD1,TABLEBFIELD2) values ('propertyAValue','propertyBValue');
バグが見つかりました。 https://bugs.eclipse.org/bugs/show_bug.cgi?id=438316これはメガノであり、触れられていない。回避策はありますか? –