【问题标题】:Spring JPA Data "OR" querySpring JPA 数据“或”查询
【发布时间】:2012-05-04 12:04:20
【问题描述】:

我正在使用 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 列的 or 子句。

另外,有没有办法传入一个对象列表。例如,如果我想查找具有 3 个状态的项目,我将不得不创建另一个查询,它不能很好地扩展。

谢谢。

编辑:

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

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

然后您可以将一个列表作为第二个参数传递给该方法。如果不使用 @Query 表示法,仍然不知道如何做到这一点。

【问题讨论】:

  • 我认为这就是 Spring Data 允许您指定查询的原因,它只能从方法名称中确定您想要的内容。这对于简单的查询很好,但一旦增加了复杂性,你最好准确地告诉它你想要什么,而不是让它猜测。
  • 加上@Query 比冗长的方法名更容易阅读。
  • 谢谢,这也是我得出的结论。只需使用@Query。

标签: jpa spring-data-jpa


【解决方案1】:

我想通过获取特定电台的所有数据来做同样的事情,那是在两个日期之间。

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 与方法名称混合。

【讨论】:

    【解决方案2】:

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

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

    In 和 NotIn 也将 Collection 的任何子类作为参数 作为数组或可变参数。对于相同的其他语法版本 逻辑运算符检查Repository query keywords

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

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

    【讨论】:

    • 谢谢。当我问这个问题时,这些关键字不可用。
    【解决方案3】:
    @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);
    

    【讨论】:

    • 欢迎来到 Stack Overflow,感谢您提供答案。您能否编辑您的答案以包括对您的代码的解释?这将帮助未来的读者更好地理解正在发生的事情,尤其是那些不熟悉该语言并努力理解这些概念的社区成员。当社区已经验证了几个答案时,这一点尤其重要。在什么条件下您的方法可能更受欢迎?您是否在利用新功能?
    猜你喜欢
    • 2021-02-17
    • 2020-01-16
    • 2019-04-01
    • 1970-01-01
    • 2018-06-27
    • 2015-03-07
    • 2020-02-08
    • 1970-01-01
    • 2021-09-15
    相关资源
    最近更新 更多