首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring JPA数据"OR“查询

Spring JPA数据"OR“查询
EN

Stack Overflow用户
提问于 2012-04-24 04:42:16
回答 3查看 22K关注 0票数 20

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

代码语言:javascript
复制
List<Item> findByTypeAndStateOrStateAndStartDateBetween(Type type, State s, State s2, Date startDate, Date endDate);

我的目标是构建一个这样的查询:

代码语言:javascript
复制
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符号传递状态列表。你可以这样做:

代码语言:javascript
复制
@Query("FROM item i WHERE i.type = ?1 AND i.state IN (?2)")

然后,您可以将一个列表作为第二个参数传递给该方法。我仍然不知道如何在不使用@Query符号的情况下做到这一点。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-09-16 20:24:03

好吧,你已经很接近了。要在不使用@Query的情况下执行此操作,可以使用InIsIn关键字(不确定在提出问题时是否支持这些关键字):

代码语言:javascript
复制
List<Item> findByTypeAndStateInAndStartDateBetween(Type type, Collection<State> states, Date startDate, Date endDate);

和NotIn中的

还将集合的任何子类以及数组或变量作为参数。对于完全相同的逻辑运算符的其他语法版本,请查看Repository query keywords

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

参考:表4. Query creation文档中方法名称中支持的关键字

票数 3
EN

Stack Overflow用户

发布于 2016-12-07 00:31:06

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

代码语言:javascript
复制
findByStartdateBetweenOrEnddateBetweenAndStation(start,end,start,end,station)
Gives you ==>
SELECT...WHERE (startdate between start,end) OR ( enddatebetween start,end AND station=station)

和:

代码语言:javascript
复制
findByStationAndStartdateBetweenOrEnddateBetween(station, start,end,start,end)
Gives you ==>
SELECT...WHERE (station=station AND startdate between start,end) OR enddatebetween start,end

正如我所希望的,这两个都是错的:

代码语言:javascript
复制
 SELECT...WHERE station=station AND (startdate between start,end OR enddatebetween start,end)

使用@查询非常具体,不要冒险将您的AND/OR与方法名混淆。

票数 7
EN

Stack Overflow用户

发布于 2021-08-04 18:45:43

代码语言:javascript
复制
@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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10287971

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档