2017-08-16 10 views
0

これは私の問題です: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が選択しているようです。それは理にかなっていますか?

誰でも私にこれを助けることができますか?

+0

私は、sysoutを実行するか、またはhibernateに2番目のクエリを実行させる条件の実行後に何か他の処理を行う必要があると思います。 session.createCriteria(...)メソッドの後に完全なコードを表示できますか? –

+0

@MadhusudanaReddySunnapu、あなたの返事のためのthks、いいえ、私はちょうどこのコードの後に​​ 'crt.list();'をしません。 –

+0

マッピングで '@ JoinColumn'と' @Fetch'アノテーションを削除するとどうなりますか? – Naros

答えて

0

EAGER

おかげで少ないクエリが所有者エンティティが照会されたときに、クエリが実行されることだけが、実行されることを意味するものではありません。

あなたが使用できるものは@FetchMode注釈ですが、あなたの場合はFetchMode.JOINが必要と思われます。

FechtModeのJavaDoc:彼は細部に入るようhttps://docs.jboss.org/hibernate/orm/5.2/javadocs/org/hibernate/FetchMode.html

いずれにせよ、結果に注意して、フェッチモードがどのように機能するかFetchMode Join vs SubSelectからgabrielgiussiの答えを確認してください。

+0

返事ありがとうございますが、私はすでにFetchMode.JOINで@FetchModeアノテーションを使用しています。私はpersonnがフェッチされたときに外部結合でdepartementをフェッチすることを期待していましたが、does'ntです。 –

+0

ああ申し訳ありませんが、私の悪い、私はそれを間違って読む –

+0

しかし、すでにフェッチタイプとすべてを持っている場合、あなたはcrt.setProjection(Projections.projectionList()を追加する必要はありません。プロパティ( "dept"))););それは既にクエリで持っています –

関連する問題