我正在使用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表示法,仍然不知道如何做到这一点。
答案 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
的情况下执行此操作,可以使用In
或IsIn
关键字(不确定在询问问题时是否支持这些关键字):
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);