@Param在春季数据JPA中不起作用



我正在设置一个弹簧数据JPA回购,以便在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;每当我试图调用该方法时。知道为什么会发生这种情况?

好的,基于@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时直接使用序列的人是有帮助的。

最新更新