2017-06-21 7 views
1

ドキュメント(https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.query-creation) で何か具体的なものを見つけられず、いくつかのブログで満足のいく回答はありません。 ここに私の質問です。SpringブートJPAフィルタ(ジョインテーブル別)

私は次のようにテーブルのエンティティを持っている:

@Entity 
@Table(name = "workstation") 
public class Workstation 
{ 
@ManyToOne(fetch = FetchType.LAZY) 
@JoinColumn(name = "userid", nullable = false) 
public User user; 
} 

とユーザーテーブルエンティティ:

public class user 
{ 
@Id 
@GeneratedValue(strategy = IDENTITY) 
@Column(name = "ID", unique = true, nullable = false) 
public Integer id; 

@Column(name = "age", nullable = false) 
public int age 
} 

今、私はこのような私のリポジトリでクエリを持っているしたいと思います:

public interface WorkstationRepo extends CrudRepository<Workstation, Long> { 
findByUserAgeLesserThan(int maxAge); 
} 

私は、ワークステーションエンティティを通じて特定の年齢以下のすべてのユーザーを検索したいと考えています。

@Queryアノテーションなしでも可能ですか?または/そしてどのように見えるのでしょうか?

@Query("SELECT w from Workstation w INNER JOIN w.user u where u.age < :age") 
List<Workstation> findByUserAgeLessThan(@Param("age") int age); 

は基本的に、あなたが使用してテーブルをJOINする必要があります。

答えて

0

@Query("Select w from Workstation w where w.user.age < :maxAge") 
List<Workstation> findByUserAgeLesserThan(@Param("maxAge") int maxAge); 
+0

まあ、とても良い最初のオプションのdidntの仕事を。問題はより複雑な名前になります。例えば私たちが "AllUsers"と "TrueAge"を使用すると、Spring cantはそれを調べます。 –

+1

最初のオプションの問題は何ですか?私はそれをローカルでテストしました。 –

+0

はい少し複雑なクエリが含まれている場合、クエリメソッド名は本当に複雑で長くなります。今のところ最良のオプションは '@Query()'を使うことです。 –

0

あなたはこのような何かを持っている必要があり、あなたのクエリ代わりにあなたも書くことができ、この

List<Workstation> findByUserAgeLessThan(int maxAge); 

をお試しくださいJPQL

+0

ありがとう!だから手でクエリを使用して今のところ最も明白なようです:) –

+0

しかし、** @ Param **は廃止されているようです....ですので、最初の変数のクエリ "?1"を使用すると役立ちます。 –

0

これは動作します:

@Query("SELECT w from Workstation w INNER JOIN w.user u where u.age < ?1") 
List<Workstation> findByUserAgeLessThan(int age); 
関連する問題