2016-11-15 6 views
1

突起豆と連鎖セッターを無視:私はので、パフォーマンスの問題の突起豆を使用していますHibernateは次のように記述することができ、私はQueryDsl/JPA/Hibernateで単純なクエリをしています

SELECT u.id, u.name FROM user u WHERE u.id = 1;

... QueryDslで

このようなクエリを見て:

query.from(qUser).where(qUser.id.eq(1)).singleResult(
    Projections.bean(User.class, 
     qUser.id, 
     qUser.name 
    ) 
); 

私の問題は私のUserエンティティです。私はすべてのセッターがthisを返すように私のセッターを連鎖したい。私が投影BeanでHibernateを実行するとき、私のデバッグモードでそれを見たsetterを呼び出さないでください。私のUserエンティティは初期化されていません。このUser実体宣言とexempleについては

User: {id: 1, name: null} 

この問題を解決するためのソリューションがあります:

@Entity(name = "USER") 
public class User { 

    @Column(name = "ID") 
    private Long id; 

    @Column(name = "NAME") 
    private String name; 

    public void setId(Long id) { //Setter called 
     this.id = id; 
    } 

    public User setName(String name) { //Setter not called 
     this.name = name; 
     return this; 
    } 
} 

私はnull名前と私のクエリによって返されるユーザーが持っていますか?

答えて

2

実際にJava Beanパッケージの深い調査とデバッグを行った後、私は何が起こっているのか把握しました。

連鎖セッターは、Java Bean仕様に準拠していません。そのためQueryDslは私のBeanを初期化するために、いくつかのイントロスペクションを行うとき、それは「セッターの連鎖」返さないgetWriteMethodメソッドを呼び出す...

だから私は二つの選択肢があると思い:

まず: DOはJava Beanの仕様を尊重するチェーン設定ツールではありません。

第2:Projections.bean()を使用する代わりに、Projections.fields()を使用してください。この最後のメソッドはセッターを使用しません。だからあなたのニーズに応じて良いかどうかは...

関連する問題