2012-04-23 315 views
10

我正在使用Spring Data JPA并试图将查询添加到我的存储库。我试图只是生成查询,而不@Query注释,如:Spring JPA数据“OR”查询

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表示法的情况下做到这一点。

+3

我想这就是为什么春季数据,您可以指定查询,就只能走这么远在决定你的方法名单独想要什么。对简单的查询来说很好,但是一旦你增加了复杂性,你最好告诉它你想要的是什么,而不是猜测它。 – Thevenin 2012-05-26 17:00:23

+0

再加上@Query比冗长的方法名称更容易阅读。 – skel625 2012-05-26 23:48:18

+0

谢谢,这也是我得出的结论。只需使用@Query。 – devo 2012-05-30 16:30:28

回答

1

那么,你是非常接近。要做到这一点,而不@QueryInIsIn关键字都可以使用(不知道这些关键字是否在问题被问时支持):

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

在和NotIn还需要收集的任何子类的参数以及数组或可变参数 。对于逻辑运算符检查Repository query keywords的其他语法版本非常相同 。

这就足够了您需要为OR标准传递任意数量的状态。

参考:表4方法名称里面支持关键字Query creation文档

+0

谢谢。这些关键字在我问这个问题时不可用。 – devo 2017-09-17 15:24:58

2

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

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