Spring JPA Data“OR”查询

时间:2012-04-23 20:42:16

标签: jpa spring-data-jpa

我正在使用Spring Data JPA并尝试向我的存储库添加查询。我试图在没有@Query注释的情况下构建查询,如:

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 个答案:

答案 0 :(得分:4)

我希望在获取特定电台的所有数据时做同样的事情,即两个日期之间。

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非常具体,不要把你的AND / OR与方法名混合。

答案 1 :(得分:1)

嗯,你很亲密。要在没有@Query的情况下执行此操作,可以使用InIsIn关键字(不确定在询问问题时是否支持这些关键字):

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

In和NotIn也将Collection的任何子类作为参数   作为数组或varargs。对于其他语法版本非常相同   逻辑运算符检查Repository query keywords

这足以满足您为OR标准传递任意数量的状态的需要。

参考:表4. Query creation docs

中方法名称中支持的关键字

答案 2 :(得分:0)

@Query("FROM item i WHERE i.type = :type AND i.state IN (:state1, :state2)")
List<Item> findByTypeAndTypeIn(@Param("type") Type type, @Param("state") State s1, @Param("state2") State s2);