2016-08-07 22 views
0

モデル:Spring Data JPAを使用して異なるエンティティフィールドを取得するには?

class User {String firstName, String lastName}; 
class Job {String name, List<User> users, List<User> checkers}; 

免責事項。 ジョブには名前、このジョブで作業するユーザー、作業結果をチェックするチェッカーユーザーがいます。

はここで春データリポジトリです:

SELECT DISTINCT checker FROM job WHERE job.user in (?1) -- ?1 - here are users provided 

これを実行する方法:

interface JobDao extends PagingAndSortingRepository<Job>{ 
    List<Job> findByUsers(Collection<User> users); //this return list of Jobs. 
    List<User> findCheckersByUsers(Collection<User> users); //I'd like to get list of users that check work for provided users. But it doesn't work this way. 
} 

ここで私が取得したい普通のSQLですか?

P. S.

  1. 私は約Projectionsを読んで、それは私がしたいことと同じではありませんに見えてきました。私は既に必要なものを持っているので、私は追加のインターフェイスを作成したくありません。
  2. 確かに、私はfindByUsersメソッドを使用して、JavaストリームAPI jobs.stream().map(Job::getChecker).collect(toSet());を使用することができますが、それはかなり見えません。
+0

'findDistinctCheckersByUsers'はジョブを実行しませんか? [ここから](http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.query-methods.query-creation)。 – Tunaki

+0

@Tunaki、いいえ、このメソッドは 'User'エンティティではなく' Job'のコレクションを返します。 – omickron

答えて

2

まず、ユーザーを見つけるためにこのメソッドをUserRepositoryに配置します。しかし、とにかく、あなただけが必要です

@Query("select distinct checker from Job job" 
     + " join job.checkers checker" 
     + " join job.users user" 
     + " where user in :checkedUsers") 
List<User> findCheckersOf(@Param("checkedUsers") Set<User> users) 
+0

しかし、仕事は何ですか?チェッカーですか?私はJavaのような実体を持っていません。確かに、私はjob_usersとjob_checkersという名前のデータベースにテーブルを持っています。 @Queryコードのテーブルをどのように参照できますか? – omickron

+0

あなたの質問では、Jobエンティティに 'List チェッカー'があると言っています。そうでない場合は、質問を編集し、実際のコードを投稿してください。問合せではJPQL問合せが必要です。 SQLクエリではありません。 JPQLは、エンティティ、フィールドおよび関連付けで動作し、テーブルや列名では動作しません。 JPQL(またはHQL)について聞いたことがない人は、JPAの重要な部分であるため、ドキュメントを読んでください。 –

+1

ああ、job.checkers - これはJobエンティティのフィールドです。とった。ありがとう、今しようとします – omickron

関連する問題