我正在使用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符号的情况下做到这一点。
发布于 2017-09-16 20:24:03
好吧,你已经很接近了。要在不使用@Query的情况下执行此操作,可以使用In或IsIn关键字(不确定在提出问题时是否支持这些关键字):
List<Item> findByTypeAndStateInAndStartDateBetween(Type type, Collection<State> states, Date startDate, Date endDate);和NotIn中的
还将集合的任何子类以及数组或变量作为参数。对于完全相同的逻辑运算符的其他语法版本,请查看Repository query keywords。
这将满足您为OR标准传递任意数量的状态的需要。
参考:表4. Query creation文档中方法名称中支持的关键字
发布于 2016-12-07 00:31:06
我想做同样的事情来获取特定站点的所有数据,也就是在两个日期之间。
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与方法名混淆。
发布于 2021-08-04 18:45:43
@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);https://stackoverflow.com/questions/10287971
复制相似问题