2017-04-11 4 views
2

私は、Spring JPAの投影を使用してクエリ結果から不要なデータを除外しようとしています。しかし、私は同じインタフェース方法で使用する必要がある複数の予測を持っています。Spring JPA:同じクエリインターフェイスで複数の投影を使用する

問題は、私は異なる戻りオブジェクトで同じメソッドからデータを照会しようとしていますが、javaはこれを許可していません。

クエリはメソッド名に基づいてJPAによって自動的に生成されるため、メソッド名を変更することはできません。私はそれが面倒とここ

不要だと思うので、

新しいインターフェイスを作成する以外の選択肢は、私がやろうとしています何のサンプルコードは、そこです。

Auto-Generated Query

public interface UserRepository extends CrudRepository<UserAccount, Long> { 

    AuthenticateProjection getByUsername(String username); 

    UserDetailsProjection getByUsername(String username); 

} 

Projections

public interface AuthenticateProjection { 

    @Value("#{target.username}") 
    String getUsername(); 

    @Value("#{target.credentail.token}") 
    String getHashPassword(); 
} 

public interface UserDetailsProjection { 

    @Value("#{target.username}") 
    String getUsername(); 

    @Value("#{target.firstname}") 
    String getFirstName(); 

    @Value("#{target.lastname}") 
    String getLastName(); 
} 
+0

によってクエリメソッドを呼び出すことができます - これは、コントローラからの復帰、または内部のためでありますつかいます? – chrylis

+0

@chrylisコントローラーに戻ります – XPLOT1ON

答えて

2

だから私は、単一のクエリで複数の投影を使用する方法を見つけ出すことができました。

<T> T getByUsername(String username, Class<T> projection) 

これにより、メソッド呼び出し元は、クエリに適用される投影のタイプを指定できます。

これをさらに改善するために、エラーが発生しにくいため、クラスにパラメータを挿入できるように、投影を拡張する必要がある空白のインターフェイスを作成しました。

public interface JPAProjection { 
} 

public interface UserRepository extends CrudRepository<UserAccount, Long> { 
    <T extends JPAProjection > T getByUsername(String username, Class<? extends JPAProjection> projection); 
} 

Projection Interface

public interface UserDetailsProjection extends JPAProjection{ 
    @Value("#{target.username}") 
    String getUsername(); 

    @Value("#{target.firstname}") 
    String getFirstname(); 

    @Value("#{target.lastname}") 
    String getLastname(); 
} 

それから私は、なぜあなたは、「フィルタ」に情報を希望している

getByUsername("...", UserDetailsProjection.class) 
+0

私はあなたの同じソリューションを使用しようとしましたが、それは私のためには機能しません。 Eclipseコンソールで、次のエラーが表示されます。 '原因:org.hibernate.hql.internal.ast.QuerySyntaxException:予期しないトークン:1行目、9列目から[com.app.company.domain.organization.Organizationから選択してくださいgeneratedAlias0 generatedAlias0.deletedAtはnull] 'です。 "select"ステートメントを見てください。カラムはありません。多分同じ問題がありましたか?リポジトリは正しい投影タイプを受けていないようです.....どんな考えですか?どうもありがとう! –

+0

これは奇妙です。私は何の問題もなかった。インプラントをつけてもらえますか?おそらくペーストビンですか? @AndreaBevilacqua – XPLOT1ON

関連する問題