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

Posted

技术标签:

【中文标题】在 Hibernate 中使用 @Query 进行带参数的本机查询【英文标题】:Native query with parameters using @Query in Hibernate 【发布时间】:2019-02-22 03:08:57 【问题描述】:

我正在尝试使用名为 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 在 cmets 中的建议,我尝试使用 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

【问题讨论】:

您可以将值作为参数传递给查询。但不是表、列或序列名称。数据库需要这些信息来准备查询计划。 如果我没记错的话,您可以使用 SpEL 通过连接参数值来模拟它。谷歌为它。为您完成:spring.io/blog/2014/07/15/… 我遵循这个例子: 非常感谢!我尝试了很多方法,但无法集成一个简单的字符串。更新了问题 FWIW JPQL 不是“本机”查询。 SQL 是本机查询。 JPQL 是一种完全不同的查询语言。建议你修正一下这个标题 【参考方案1】:

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);

这适用于为多个存储库继承的接口,可能对您没有真正的帮助。

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

【讨论】:

以上是关于在 Hibernate 中使用 @Query 进行带参数的本机查询的主要内容,如果未能解决你的问题,请参考以下文章

在 Spring Boot、Hibernate 中使用 @Query 注解以 JSON 格式(键值对)查询结果

hibernate总结一

Hibernate 中Criteria Query查询详解

Hibernate Query Language查询:

分享知识-快乐自己:Hibernate 中Criteria Query查询详解

hibernate创建本地查询后进行查询的时候报错: could not execute query;列名无效