Spring JPA查询- JSON_REMOVE -动态传递查询索引

2uluyalo  于 2023-07-01  发布在  Spring
关注(0)|答案(1)|浏览(138)

我使用JSON_REMOVE方法从JSON数组列中删除一个字段。下面是我在JPA中写的查询-

@Modifying
@Transactional
@Query("UPDATE Data d SET d.month = JSON_REMOVE(d.month, '$[0].revenue') "
        + " WHERE d.year = :year ")
void resetRevenue(Integer year);

上面的查询起作用了。但是现在我想动态地传递索引值,就像-

@Modifying
@Transactional
@Query("UPDATE Data d SET d.month = JSON_REMOVE(d.month, '$[ :index ].revenue') "
        + " WHERE d.year = :year ")
void resetRevenue(Integer index, Integer year);

当我尝试上面我得到错误-java.sql.SQLSyntaxErrorException: Invalid JSON path expression. The error is around character position 3.
我甚至试着在下面查询-

@Modifying
@Transactional
@Query("UPDATE Data d SET d.month = JSON_REMOVE(d.month, '$[ ?1 ].revenue') "
        + " WHERE d.year = ?2 ")
void resetRevenue(Integer index, Integer year);

但出现错误-org.springframework.dao.InvalidDataAccessResourceUsageException: Ordinal parameter not bound : 2

92vpleto

92vpleto1#

您面临的问题是JPA不直接支持JSON路径表达式的参数绑定。要解决这个问题,可以使用本机SQL语法动态构造查询。下面是一个例子:

@Modifying
@Query(value = "UPDATE Data d SET d.month = JSON_REMOVE(d.month, CONCAT('$[', :index, '].revenue')) WHERE d.year = :year", nativeQuery = true)
void resetRevenue(@Param("index") Integer index, @Param("year") Integer year);

在这种方法中,使用CONCAT函数动态构造JSON路径表达式。确保包含@Param注解,以将方法参数Map到查询中的命名参数。
通过使用此方法,您应该能够动态传递索引值并从JSON数组列中删除指定的字段。

相关问题