2012-04-23 10 views
10

私はSpring Data JPAを使用しており、リポジトリにクエリを追加しようとしています。私はちょうどのような@query注釈なしでクエリを構築しようとしていた。Spring JPAデータ "OR"クエリ

List<Item> findByTypeAndStateOrStateAndStartDateBetween(Type type, State s, State s2, Date startDate, Date endDate); 

私の目標は、そのようなクエリを構築することです:

select * from item where type = ? and (state = ? or state = ?) and start_date between ? and ? 

私の問題は、OR句です。角かっこがあることを確認する方法はありますか?それ以外の場合は、ロジックが正しくありません。私がここに見つけた例: http://static.springsource.org/spring-data/data-jpa/docs/1.0.0.M1/reference/html/#jpa.query-methods.query-creation

1つ以上の句の句がありません。

また、オブジェクトのリストを渡す方法もあります。たとえば、3つの州の商品を見つけたい場合、別のクエリを作成する必要があります。これはうまく調整できません。

ありがとうございました。

編集:私は@query表記を使用して状態のリストを渡す方法を考え出し

。そうですね。

@Query("FROM item i WHERE i.type = ?1 AND i.state IN (?2)") 

次に、2番目のパラメータとしてメソッドにリストを渡すことができます。 @Query表記を使わずにこれを行う方法はまだ分かりません。

+3

でメソッド名の内部表4.サポートされているキーワードを、私はこの春、データがクエリを指定することができますなぜ、それだけであなただけではメソッド名から欲しいものを決定する際に、これまで行くことができると思います。単純なクエリでは問題ありませんが、複雑さを増やしてしまえば、推測するのではなく、必要なものを正確に伝える方がよいでしょう。 – Thevenin

+0

さらに、@Queryは長いメソッド名より読みやすくなります。 – skel625

+0

ありがとう、これは私が同様に来た結論です。 @Queryを使うだけです。 – devo

答えて

1

まあ、あなたはとても近いです。 @Queryせずにこれを行うにはInまたはIsInキーワードは、(これらのキーワードは、質問を頼まれた時にサポートされていたかどうかわからない)を使用することができます。

List<Item> findByTypeAndStateInAndStartDateBetween(Type type, Collection<State> states, Date startDate, Date endDate); 

でとNotInもパラメータとしてコレクションの任意のサブクラスを取ります配列やvarargsとして も同様です。全く同じ 論理演算子チェックの他の構文バージョンについては、Repository query keywordsをチェックしてください。

これは、OR条件に任意の数の状態を渡す必要があります。

参考:Query creationドキュメント

+0

ありがとうございます。これらのキーワードは私がこの質問をしたときには利用できませんでした。 – devo

2

特定のステーションのすべてのデータを取得することで、同じことを2回行ったかったのです。

findByStartdateBetweenOrEnddateBetweenAndStation(start,end,start,end,station) 
Gives you ==> 
SELECT...WHERE (startdate between start,end) OR (enddatebetween start,end AND station=station) 

そして:私が望んでいたよう

findByStationAndStartdateBetweenOrEnddateBetween(station, start,end,start,end) 
Gives you ==> 
SELECT...WHERE (station=station AND startdate between start,end) OR enddatebetween start,end 

はどちらも間違っている:

SELECT...WHERE station=station AND (startdate between start,end OR enddatebetween start,end) 

は非常に特異的であるように、あなたのAND/ORとを混合チャンスを取ることはありません@queryを使用しますメソッド名

関連する問題