【问题标题】:(Spring JPA) Method name query(Spring JPA) 方法名查询
【发布时间】:2021-09-18 23:33:04
【问题描述】:

首先,对不起我的英语不好。

我想将以下查询更改为“findBy~”方法,但我不知道如何。

@Query(value = "SELECT t FROM Table t WHERE (b.num1 = :variable or b.num2 IS NULL)")

或者,使用 'findby~' 方法名是不可能得到结果的吗? 如果有人能回复我将不胜感激。

【问题讨论】:

    标签: mysql jpa


    【解决方案1】:

    Spring Data JPA 确实支持查询中的所有条件和条件嵌套。我认为您的查询名称将变得不必要地冗长。它最终会成为

    Table findByNum1LessThanEqualOrNum1IsNullAndNum2GreaterThanEqualOrNum2IsNull(Integer var0, Integer var1);
    

    这应该返回适​​当的查询,但您需要发送变量两次,每个equals 一次。

    使用@Query,您可以随意调用查询并重复使用相同的变量。

    现在,您可以通过使用默认方法来解决使用命名方法的缺点,例如

    default Table myQuery (Integer var) {
        return findByNum1LessThanEqualOrNum1IsNullAndNum2GreaterThanEqualOrNum2IsNull(var, var);
    }
    

    所以你调用它而不是实际的查询,但话又说回来,如果你不评论你的代码(你应该评论你的代码)。无论如何,我建议您对简单查询使用方法名称,对更复杂的查询使用 @Query

    请参考以下链接进一步阅读:

    Spring JPA Query Creation

    Spring JPA Query Keyword Repository

    LeafyJava article on Query Precedence Tricks,它还提供了如何更改查询逻辑的示例,以防条件未按您想要的方式排列。

    This SO question also provides a bit of insight.

    【讨论】:

    • 非常感谢您的回答!我用你的方法名试过了,但是返回了不合适的结果。查询就像'~ where num1 = ?或 num2 为空'。它们没有用 '()' 括起来,所以返回的记录太多。
    • 是的,我害怕发生这种情况。据我了解,JPA 包含从右到左读取的条件,但我还没有找到它的适当文档。在我提供的第三个和第四个链接中,有一种替代方法可以更改查询的逻辑以获得相同的结果(逻辑等价)。这是我知道的唯一替代方法,但由于方法以名称结尾,我没有使用它。
    猜你喜欢
    • 2019-06-10
    • 2019-08-26
    • 2019-04-01
    • 2021-03-15
    • 1970-01-01
    • 2018-11-16
    • 2020-02-24
    • 2022-01-23
    • 1970-01-01
    相关资源
    最近更新 更多