2012-04-23 317 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)") 

然後你可以傳遞一個列表中的方法作爲第二個參數。仍然不知道如何在不使用@Query表示法的情況下做到這一點。

+3

我想這就是爲什麼春季數據,您可以指定查詢,就只能走這麼遠在決定你的方法名單獨想要什麼。對簡單的查詢來說很好,但是一旦你增加了複雜性,你最好告訴它你想要的是什麼,而不是猜測它。 – Thevenin 2012-05-26 17:00:23

+0

再加上@Query比冗長的方法名稱更容易閱讀。 – skel625 2012-05-26 23:48:18

+0

謝謝,這也是我得出的結論。只需使用@Query。 – devo 2012-05-30 16:30:28

回答

1

那麼,你是非常接近。要做到這一點,而不@QueryInIsIn關鍵字都可以使用(不知道這些關鍵字是否在問題被問時支持):

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

在和NotIn還需要收集的任何子類的參數以及數組或可變參數 。對於邏輯運算符檢查Repository query keywords的其他語法版本非常相同 。

這就足夠了您需要爲OR標準傳遞任意數量的狀態。

參考:表4方法名稱裏面支持關鍵字Query creation文檔

+0

謝謝。這些關鍵字在我問這個問題時不可用。 – devo 2017-09-17 15:24:58

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) 

使用@Query是非常具體的,不冒險混合的和/或與方法名稱。