21

我正在使用 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 列的 or 子句。

另外,有没有办法传入对象列表。例如,如果我想查找具有 3 个状态的项目,我将不得不创建另一个查询,该查询不能很好地扩展。

谢谢。

编辑:

我想出了如何使用@Query 表示法传递状态列表。你这样做:

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

然后,您可以将一个列表作为第二个参数传递给该方法。如果不使用 @Query 表示法,仍然不知道如何做到这一点。

4

3 回答 3

7

我想做同样的事情来获取特定站点的所有数据,即在两个日期之间。

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 与方法名称混合。

于 2016-12-06T16:31:05.867 回答
3

嗯,你很亲密。要做到这一点,可以使用不@Query使用InorIsIn关键字(不确定在提出问题时是否支持这些关键字):

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

In 和 NotIn 也将 Collection 的任何子类以及数组或可变参数作为参数。对于相同逻辑运算符的其他语法版本,请检查存储库查询关键字

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

参考:表 4.查询创建文档中方法名称中支持的关键字

于 2017-09-16T12:24:03.413 回答
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);
于 2021-08-04T18:45:42.713 回答