在Hibernate中使用@Query使用参数进行本机查询

时间:2018-09-18 06:48:28

标签: hibernate spring-boot spring-data-jpa mariadb jpql

我正在尝试使用名为F0001的序列对MariaDb 10.3设置@Query方法的参数

this tutorial的第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

我在这里想念什么?

谢谢。

PS:我看到了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);

但是a ...

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

1 个答案:

答案 0 :(得分:2)

JB Nizet给了您正确的答案。

  

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

不幸的是,带有SpEL的“技巧”不起作用。 SpEL被转换为绑定参数,因此适用相同的约束。该规则有一个例外,即当SpEL表达式仅使用实体名称时(如本示例中所述,该实体名称取自Spring Data JPAs integration tests

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

这是用于在多个存储库中继承的接口中使用的,可能对您没有帮助。

您可能要做的是调用存储过程,该存储过程根据参数对序列进行查询。