【问题标题】:@Param not working in Spring Data JPA@Param 在 Spring Data JPA 中不起作用
【发布时间】:2017-09-21 06:34:12
【问题描述】:

我正在设置一个 Spring Data JPA Repo 来处理 postgresql 数据库中的序列。我以为这很简单:

@Query(nativeQuery = true, value = "CREATE SEQUENCE IF NOT EXISTS ':seq_name' START WITH :startAt")
fun createSequence(@Param("seq_name") seq_name: String, @Param("startAt") startAt: Long = 0)

@Query(nativeQuery = true, value = "SELECT nextval(':seq_name')")
fun nextSerial(@Param("seq_name") seq_name: String) : Long

@Query(nativeQuery = true, value = "DROP SEQUENCE IF EXISTS ':seq_name'")
fun dropSequence(@Param("seq_name") seq_name: String)

@Query(nativeQuery = true, value = "setval(':seq_name', :set_to, false")
fun setSequence(@Param("seq_name") seq_name: String, @Param("set_to") setTo: Long)

但由于某种原因,我得到了 org.springframework.dao.InvalidDataAccessApiUsageException: Parameter with that name [seq_name] did not exist; 每当我尝试调用该方法时。知道为什么会发生这种情况吗?

【问题讨论】:

  • 使用 ?1 访问参数时也会发生同样的情况
  • classpath 上有哪个版本的 spring-data-jpa?
  • 只需删除 ' 字符,例如@Query(nativeQuery = true, value = "SELECT nextval(:seq_name)")
  • 删除刻度适用于选择查询。对于创建查询,我现在得到一个 org.hibernate.exception.SQLGrammarException: could not extract ResultSet
  • 可能是因为您正在参数化一些无法参数化的东西,例如序列名称。

标签: spring postgresql spring-data-jpa kotlin


【解决方案1】:

好的,根据@StanislavL 的回答,经过一些调试,我现在有了一个可行的解决方案。正如@posz 指出的那样,我无法绑定标识符,这意味着我必须对查询进行硬编码。我将代码从一个 JPA 接口移到了一个实现的服务,它不是那么好但是可以工作。

@Service
open class SequenceService (val entityManager: EntityManager){

    @Transactional
    fun createSequence(seq_name: String, startAt: Long = 0) {
        val query = entityManager.createNativeQuery("CREATE SEQUENCE IF NOT EXISTS ${seq_name} START ${startAt}")
        with(query){
            executeUpdate()
        }
    }

    @Transactional
    fun nextSerial(seq_name: String) : Long {
        val query = entityManager.createNativeQuery("SELECT nextval(:seq_name)")
        with(query){
            setParameter("seq_name", seq_name)
            val result = singleResult as BigInteger
            return result.toLong()
        }

    }

    @Transactional
    fun dropSequence(seq_name: String) {
        val query = entityManager.createNativeQuery("DROP SEQUENCE IF EXISTS ${seq_name}")
        with(query){
            executeUpdate()
        }
    }

    @Transactional
    fun setSequence(seq_name: String, setTo: Long){
        val query = entityManager.createNativeQuery("SELECT setval(:seq_name, :set_to, false)")
        with(query){
            setParameter("seq_name", seq_name)
            setParameter("set_to", setTo)
            singleResult
        }
    }
}

我希望这对下一个尝试直接使用序列的人有所帮助,因为@SequenceGenerator 不是一个选项。

【讨论】:

    猜你喜欢
    • 2017-03-29
    • 2018-08-31
    • 1970-01-01
    • 1970-01-01
    • 2018-12-09
    • 2018-03-20
    • 2015-01-20
    • 2017-06-09
    • 2016-03-04
    相关资源
    最近更新 更多