1
アノテーションを使用してマッピングを設定して、今よりも少ないクエリを取得するにはどうすればよいですか? データの読み取りのみが必要です。アノテーションを使用してマッピングを設定して、今よりも少ないクエリを取得するにはどうすればよいですか?
...
private Long id;
private String firstName;
private String lastName;
private Address address;
private Set<Office> offices = new HashSet<Office>();
private Map<Office, Position> positions = new HashMap<Office, Position>();
private Office office;
...
@OneToOne
@JoinColumn(name = "ADDRESS_ID")
public Address getAddress() {
return address;
}
@ManyToMany(fetch = FetchType.EAGER, targetEntity = Office.class)
@JoinTable(name = "H_OFFICE_EMPLOYEE",
joinColumns = {@JoinColumn(name = "EMPLOYEE_ID")},
inverseJoinColumns = {@JoinColumn(name = "OFFICE_ID")})
public Set getOffices() {
return offices;
}
@ManyToMany(targetEntity = Position.class)
@JoinTable(name = "H_OFFICE_EMPLOYEE",
joinColumns = {@JoinColumn(name = "EMPLOYEE_ID")},
inverseJoinColumns = {@JoinColumn(name = "POSITION_ID")})
@MapKeyManyToMany(joinColumns = @JoinColumn(name = "OFFICE_ID"), targetEntity = Office.class)
public Map getPositions() {
return positions;
}
...
1人の従業員得るとき、私は(と彼の住所、市、国、彼が働く企業の従業員は、彼が働いてすべてのオフィス()でカウント、)コンソールで次のクエリを取得:
Hibernate: select employee0_.EMPLOYEE_ID as...
Hibernate: select address0_.ADDRESS_ID as...
Hibernate: select offices0_.EMPLOYEE_ID as...
Hibernate: select positions0_.EMPLOYEE_ID as...
Hibernate: select employees0_.OFFICE_ID as...
Hibernate: select offices0_.EMPLOYEE_ID as...
Hibernate: select employees0_.OFFICE_ID as...
Hibernate: select positions0_.EMPLOYEE_ID as...
より少ないクエリを得るためにマッピングで変更する必要があるのは何ですか?
テストするには、@ManyToMany(fetch = FetchType.EAGER、targetEntity = Office.class)の後に@Fetch(FetchMode.JOIN)を追加します。ただし、クエリのカウントは同じままです。私は間違っているの? –
JPQLを使用し、関連性の高いほとんどの状況で結合クエリをフェッチしても、動作するはずです。私は明日近く見てみましょう。 –
私はあなたのデータ構造を再構築することをテストし、期待通りに機能し、すべてを1つのステートメントでフェッチしました。私はこの実際のコードと設定の問題が何であるか分かりません。横に注意してください:ほとんどの場合、より多くのステートメントを持ち、より少ない結合 - すべてを持つ方がよいかもしれません。しかし、それは一般的に可能です。 –