Spring JPA Data“OR”查询

27

我正在使用Spring Data JPA,并尝试向我的Repository中添加一个查询。我试图构建查询,但没有使用@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 没有任何带有多个列的or子句。
此外,是否有一种方法可以传入对象列表。例如,如果我想查找具有3个状态的项目,我将不得不创建另一个查询,这并不很可扩展。
谢谢。
编辑:
我弄清楚如何使用@Query注释传递状态列表。你可以这样做:
@Query("FROM item i WHERE i.type = ?1 AND i.state IN (?2)")

然后你只需要将列表作为第二个参数传递给该方法即可。仍然不知道如何在不使用@Query注释的情况下完成此操作。


3
我认为这就是为什么Spring Data允许你指定查询,因为仅凭方法名称无法完全确定你想要的内容。对于简单查询来说没问题,但是一旦复杂度增加,最好告诉它你需要什么而不是让它猜测。 - Mark Sholund
此外,@Query 比冗长的方法名更易于阅读。 - skel625
谢谢,这也是我得出的结论。只需使用@Query即可。 - devo
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与方法名。


4

很好,你已经非常接近了。如果不使用 @Query ,可以使用 InIsIn 关键字(不确定这些关键字在问题提出时是否被支持):

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

In和NotIn还可以将任何Collection子类作为参数,以及数组或varargs。有关相同逻辑运算符的其他语法版本,请查看Repository query keywords

这将满足您传递OR条件的任意状态的需求。

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


谢谢。当我提出这个问题时,这些关键词还不可用。 - devo

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);

5
欢迎来到Stack Overflow,感谢您贡献答案。请您编辑您的答案,加入代码解释。这将有助于未来的读者更好地理解代码的含义,尤其是那些刚接触该编程语言并且难以理解概念的新成员。在社区已经有几个经过验证的答案时,这一点尤为重要。您的方法在什么情况下会受到青睐?您是否利用了新的功能? - Jeremy Caney

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接