gpt4 book ai didi

hibernate - 在 Hibernate 中使用 @Query 进行带参数的 native 查询

转载 作者:行者123 更新时间:2023-12-02 23:11:22 28 4
gpt4 key购买 nike

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

关于this tutorial ,第 5.2 节有这个例子

5.2。本国的 native 查询的索引参数的工作方式与 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);

可惜...

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

最佳答案

JB Nizet 给了你正确的答案。

You can pass values as parameters to a query. But not table, column or sequence names. The database needs that information in order to prepare the plan for the query.

不幸的是,SpEL 的“技巧”不起作用。 SpEL 被转换为绑定(bind)参数,因此应用相同的约束。该规则有一个异常(exception),即 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);

这旨在用于为多个存储库继承的接口(interface),并且可能对您没有真正的帮助。

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

关于hibernate - 在 Hibernate 中使用 @Query 进行带参数的 native 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52380496/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com