これは私の問題です:Hibernate - 実体の投影とフェッチ戦略
私は2クラスの人と部署を持っています。
パーソン:
@Entity
public class Personne
{
@Id
private Long id;
private String name;
@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name="dept_id")
@Fetch(FetchMode.JOIN)
private Departement dept;
// getter & setter
}
部門:
@Entity
public class Departement
{
@Id
private Long id;
private String name;
// getter & setter
}
私はそう私はプロジェクションを使っ基準クエリにpersonnの唯一のデパートを選択します:
マイコード:
Criteria crt = session.createCriteria(Personne.class);
crt.createAlias("dept", "d",JoinType.LEFT_OUTER_JOIN);
crt.setProjection(Projections.projectionList().add(Projections.property("dept")));
crt.add(Restrictions.eq("id", 1L));
上記のクエリはうまく動作しますが、2つのクエリが得られますが、フェッチタイプは熱心なので、1つしか期待できません。
ログ:
[use] 2017-08-16 16:23:07,113 DEBUG [main] SqlStatementLogger.logStatement(109) | select this_.dept_id as y0_ from Personne this_ left outer join Departement d1_ on this_.dept_id=d1_.id where this_.id=?
[use] 2017-08-16 16:23:07,119 DEBUG [main] SqlStatementLogger.logStatement(109) | select departemen0_.id as id1_0_0_, departemen0_.name as name2_0_0_ from Departement departemen0_ where departemen0_.id=?
はエンティティ火災の投影N + 1が選択しているようです。それは理にかなっていますか?
誰でも私にこれを助けることができますか?
私は、sysoutを実行するか、またはhibernateに2番目のクエリを実行させる条件の実行後に何か他の処理を行う必要があると思います。 session.createCriteria(...)メソッドの後に完全なコードを表示できますか? –
@MadhusudanaReddySunnapu、あなたの返事のためのthks、いいえ、私はちょうどこのコードの後に 'crt.list();'をしません。 –
マッピングで '@ JoinColumn'と' @Fetch'アノテーションを削除するとどうなりますか? – Naros