次のモデルを検討します。
@Entity
public class User {
@Id
@Column(name = "USER_ID")
private Long userId;
@Column(name = "FIRST_NAME")
private String firstName;
@Column(name = "LAST_NAME")
private String lastName;
@OneToOne
@PrimaryKeyJoinColumn
private UserExt userExt;
... //getters and setters
}
@Entity
public class UserExt {
@Id
@Column(name="USER_ID")
private Long id;
private String cdpId;
private Date lastChanged;
... //getters and setters
}
実行時:
Query query = session.createQuery("from User");
List<User> list = query.list();
ハイバネート実行
Hibernate: select user0_.USER_ID as USER1_0_, user0_.FIRST_NAME as FIRST2_0_, user0_.LAST_NAME as LAST3_0_, user0_.EXT_USERNAME as EXT4_0_ from USER user0_
Hibernate: select userext0_.USER_ID as USER1_1_0_, userext0_.cdpId as cdpId1_0_, userext0_.lastChanged as lastChan3_1_0_ from USER_EXT userext0_ where userext0_.USER_ID=?
Hibernate: select userext0_.USER_ID as USER1_1_0_, userext0_.cdpId as cdpId1_0_, userext0_.lastChanged as lastChan3_1_0_ from USER_EXT userext0_ where userext0_.USER_ID=?
...
...
特定のプロパティを持つクエリを使用すると機能します (u.firstName、u.userExt.cdpId を選択)。
ただし、完全な User Entity (「from User」) が必要なため、hibernate は最初の結果行ごとに 1 つの選択を生成します。
デフォルトのフェッチ戦略はEAGERではなくLAZYであるべきなので、私はそれを理解していません。LAZY に強制しても問題は解決しませんでした。