在Hibernate中使用@Query的参数化本地查询

3
我正在尝试使用名为F0001的序列来参数化针对MariaDb 10.3的@Query方法。
此教程的第5.2节中有以下示例: 5.2.本地化查询 本地化查询的索引参数与JPQL完全相同:
@Query(
  value = "SELECT * FROM Users u WHERE u.status = ?1", 
  nativeQuery = true)
User findUserByStatusNative(Integer status);

但是当我尝试做同样的事情(使用一个序列)时
@Query(value = "SELECT NEXTVAL(?1)", nativeQuery = true)
Long getNextSequenceByFleetId(String fleetId);

尽管序列在数据库中正确设置,但它对我无效。
SELECT NEXTVAL(F0001)  --> returns nextval 2

我在这里漏掉了什么?
谢谢。
附注:我看到了this post,但示例没有使用@Query注释。

更新:

根据评论区@JB Nizet的建议,我尝试使用SpEL:

https://spring.io/blog/2014/07/15/spel-support-in-spring-data-jpa-query-definitions

@Query("select u from User u where u.age = ?#{[0]}")
List<User> findUsersByAge(int age);

我已尝试以下操作:

@Query(value = "SELECT NEXTVAL(?#{[0]})", nativeQuery = true)
Long getNextSequenceByFleetId(String fleetId);

但遗憾的是...

You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''F0001')' at line 1

5
您可以将值作为参数传递给查询,但不能传递表名、列名或序列名。数据库需要这些信息才能准备查询的执行计划。 - JB Nizet
如果我没记错的话,你可以使用SpEL来模拟通过连接参数值来实现。可以在Google上搜索相关内容。这里为您提供了链接:https://spring.io/blog/2014/07/15/spel-support-in-spring-data-jpa-query-definitions - JB Nizet
非常感谢!我尝试了很多种方法,但无法集成一个简单的字符串。已更新问题。 - Orkun
2
JPQL并不是“本地”的查询语句,SQL才是本地查询语句。JPQL是一种完全不同的查询语言。建议您修正标题。 - user3973283
你只能在WHERE子句中使用参数,而不能在其之前的部分中使用。 - M. Deinum
显示剩余3条评论
1个回答

5

JB Nizet给出了正确的答案。

您可以将值作为参数传递给查询。但是不能传递表名、列名或序列名,因为数据库需要这些信息以便为查询准备计划。

不幸的是,SpEL“技巧”不起作用。 SpEL被转换为绑定参数,所以相同的约束条件适用。有一个例外情况,即当SpEL表达式仅使用实体名称时,如从Spring Data JPA的集成测试中取得的此示例:

@Query("update #{#entityName} u set u.active = :activeState where u.id in :ids")
void updateUserActiveState(@Param("activeState") boolean activeState, @Param("ids") Integer... ids);

这个是为在多个代码库中被继承的接口而设计的,可能对你并没有什么帮助。

你可以尝试调用一个存储过程,根据参数执行查询序列的操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接