【问题标题】:How do I use the same parameter multiple times in my Query using JPA?如何在使用 JPA 的查询中多次使用相同的参数?
【发布时间】:2021-09-02 23:16:24
【问题描述】:

如何在同一个查询中多次使用一个参数?这是我的查询:

@Query(value = """
        SELECT * FROM person WHERE first_name = ? or last_name = ?
        """, nativeQuery = true)
List<Person> findPerson(String name);

我需要在查询中使用两次“name”参数,我该怎么做?

注意:这只是一个虚拟示例,以便我理解逻辑。

我试过了:

@Query(value = """
    SELECT * FROM person WHERE first_name = ?1 or last_name = ?1
    """, nativeQuery = true)
List<Person> findPerson(String name);

我收到以下错误:

org.postgresql.util.PSQLException: ERROR: syntax error at or near "$1"

我也试过这个:

@Query(value = """
    SELECT * FROM person WHERE first_name = :name or last_name = :name
    """, nativeQuery = true)
List<Person> findPerson(@Param("name") String name);

这给了我同样的错误:

org.postgresql.util.PSQLException: ERROR: syntax error at or near "$1"

【问题讨论】:

  • 您对提供的查询或您未共享的其他查询是否有异常?
  • @Ben,你找到解决办法了吗?

标签: sql spring-boot jpa spring-data-jpa repository


【解决方案1】:

我找到了一个解决方案,使用你的例子:

@Query(value = """
        Declare @Name Varchar(max) = :name
        SELECT * FROM person WHERE first_name = @Name or last_name = @Name
        """, nativeQuery = true)
List<Person> findPerson(String name);

【讨论】:

    【解决方案2】:

    为什么不使用下面的两个参数?

    @Query(value = "
    SELECT * FROM person WHERE first_name = :fname or 
    last_name = :lname
    ", nativeQuery = true)
    List<Person> findPerson(@Param("fname") String 
    fnamee,@Param("lname") String lname  );
    

    或者您可以使用如下存储库方法。

    List<Person>  findByFirstNameOrLastNamee(String firstName, 
    String lastName);
    

    两次传递相同的名称。

    【讨论】:

      【解决方案3】:

      像这样

      @Query(value = "SELECT * FROM person WHERE first_name = ?1 or last_name = ?1", nativeQuery = true)
      List<Person> findPerson(String name);
      

      ?1 指的是第一个参数。

      您也可以使用特定名称来表示它。像这样:

      @Query(value = "SELECT * FROM person WHERE first_name = :myName or last_name = :myName", nativeQuery = true)
      List<Person> findPerson(@Param(name = "myName") String name);
      

      希望对你有帮助。

      【讨论】:

      • 对我不起作用...我已经更新了问题。
      • 顺便说一句,如果我只使用一次参数,那么这两种方法都有效..只有当我使用两次时。
      【解决方案4】:

      您可以简单地多次使用 ?1 作为对第一个参数的引用。基于您的代码的示例:

      @Query(value = """
          SELECT * FROM person WHERE first_name = ?1 or last_name = ?1
          """, nativeQuery = true)
      List<Person> findPerson(String name);
      

      或者你可以多次使用命名参数:

      @Query(value = """
          SELECT * FROM person WHERE first_name = :name or last_name = :name
          """, nativeQuery = true)
      List<Person> findPerson(@Param("name") String name);
      

      【讨论】:

      • 对我不起作用...我已经更新了问题。
      • 顺便说一句,如果我只使用一次参数,那么这两种方法都有效..只有当我使用两次时。
      • 可能参数和字段类型不匹配?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-28
      • 2022-11-19
      • 1970-01-01
      • 2013-06-08
      • 1970-01-01
      • 2016-04-08
      相关资源
      最近更新 更多