当前位置: 首页 > 知识库问答 >
问题:

Spring JPA Data"OR"查询

孟泽宇
2023-03-14

我正在使用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-方法。查询创建

不要有任何或超过1列的子句。

此外,还有一种方法可以传递对象列表。例如,如果我想找到具有3种状态的项,我必须创建另一个查询,它的伸缩性不太好。

谢谢。

编辑:

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

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

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

共有3个答案

鲁华茂
2023-03-14
@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);
呼延鹏云
2023-03-14

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

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

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

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

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

朱翔
2023-03-14

我想用同样的方法获取某个特定站点的所有数据,即两个日期之间的数据。

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要非常具体,不要冒险将您的和/或与方法名混合。

 类似资料:
  • 问题内容: 对于相当简单的表结构,即。 ie. Person, Criteria, and PersonCriteria (the combi-table),我现在设置了一个查询,以选择具有所有选定条件的所有人员。 此刻查询本身看起来像这样: 到目前为止,没有问题,一切正常。 现在,我想为用户提供在搜索中添加一些AND和OR变量的可能性。有人会说: 我正在寻找一个拥有以下条件的人:条件1 AND

  • 问题内容: 我已经开发了使用OR查询的系统: 与查询IN进行比较: MYSQL数据库中最好的查询是什么? 问题答案: 用于。 IN将使用索引。 否则(afaik)将不使用索引。 另外,这一点不容忽视,IN版本: 使用更少的代码 更容易维护 更容易理解 仅出于这些原因,我准备为获得代码质量而遭受一点性能损失,但实际上您也获得了性能。

  • 问题内容: 我怎么说 对于更复杂的查询,我应该使用原始SQL吗? 问题答案: 利用参数分组(Laravel4.2)。以您的示例为例:

  • 我正在使用elasticsearch从json文件中过滤和搜索,我是这项技术的新手。所以我有点困惑如何在ElasticSearch中编写查询。 这是oracle查询。如何在ElasticSearch中编写此查询?我使用的是elasticsearch版本6.8.13

  • 问题内容: 基本上,我试图从基于两个不同组的SQL中获取数据,必须相等并且必须相等,但是至于我想要同时获得和,这是我尝试的无济于事。 我很确定他们的方法可以使此查询正常工作,只是不在我脑海 问题答案: 具有比更高的优先级,因此您现有的表达式当前被评估为: 要强制使用替代逻辑,需要包括显式括号: 但是,在这种情况下,可以使用MySQL的运算符代替:

  • 问题内容: 我想在CI中组合AND OR mysql查询。我已经看过这个线程:http : //codeigniter.com/forums/viewthread/92818/。但是他们没有提供确切的解决方案。 如何严格使用CI框架创建以下查询? (我可以轻松地创建查询而无需使用方括号,但是它不是同一查询。) PS:这只是一个示例查询,即使没有意义,也不建议将查询的整个OR部分写在一个内。 编辑: