简体   繁体   English

Spring Data JPA:无法将本机查询与参数结合使用

[英]Spring Data JPA: Having trouble combining native query with parameter

My repository is defined like this:我的存储库定义如下:

@Repository
public interface RefreshJobDetailRepository extends JpaRepository<RefreshJobDetailEntity, Long> {

    @Query(nativeQuery = true, value = NATIVE_SUMMARY_QUERY_PARTIAL + " WHERE rjd.refresh_job_identifier = ?1" +
            " group by (rjd.refresh_job_identifier)) as rc")
    RefreshSummary getRefreshJobDetailSummaryById(String refreshJobId);

    interface RefreshSummary {
        // getters
    }

    String NATIVE_SUMMARY_QUERY_PARTIAL = "select ...";
}

When I run this, I get the following exception:当我运行它时,我收到以下异常:

org.springframework.dao.InvalidDataAccessApiUsageException: Name for parameter binding must not be null or empty! org.springframework.dao.InvalidDataAccessApiUsageException:参数绑定的名称不能为空或空! On JDKs < 8, you need to use @Param for named parameters, on JDK 8 or better, be sure to compile with -parameters.;在 JDK < 8 上,您需要使用 @Param 来命名参数,在 JDK 8 或更高版本上,请务必使用 -parameters 进行编译。 nested exception is java.lang.IllegalArgumentException: Name for parameter binding must not be null or empty!嵌套异常是 java.lang.IllegalArgumentException:参数绑定的名称不能为 null 或为空! On JDKs < 8, you need to use @Param for named parameters, on JDK 8 or better, be sure to compile with -parameters.在 JDK < 8 上,您需要使用 @Param 作为命名参数,在 JDK 8 或更高版本上,请务必使用 -parameters 进行编译。

What confuses me is that I'm not using a "named parameter".让我困惑的是我没有使用“命名参数”。 It's a positional parameter.这是一个位置参数。 So what is this error telling me?那么这个错误告诉我什么? We use position parameters elsewhere in our code and don't have the -parameters flag set, but this is the only native query.我们在代码的其他地方使用位置参数并且没有设置-parameters标志,但这是唯一的原生查询。 Don't know if that makes a difference or not?不知道有没有区别? BTW, the database is Postgresql.顺便说一句,数据库是Postgresql。

You can simply refactor the code to use named parameters.您可以简单地重构代码以使用命名参数。 It doesn't matter if it's a native query or jpql:不管是原生查询还是jpql:

@Query(nativeQuery = true, value = NATIVE_SUMMARY_QUERY_PARTIAL + " WHERE rjd.refresh_job_identifier = :refreshJobId" +
        " group by (rjd.refresh_job_identifier)) as rc")
RefreshSummary getRefreshJobDetailSummaryById(@Param("refreshJobId") String refreshJobId);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM