Ork*_*zen 3 hibernate jpql mariadb spring-data-jpa spring-boot
我正在尝试使用名为的序列对 MariaDb 10.3 参数化 @Query 方法F0001
在本教程的第 5.2 节中,有一个示例
5.2. 本机查询的本机索引参数的工作方式与 JPQL 完全相同:
@Query(
value = "SELECT * FROM Users u WHERE u.status = ?1",
nativeQuery = true)
User findUserByStatusNative(Integer status);
Run Code Online (Sandbox Code Playgroud)
但是当我尝试做同样的事情时(使用序列)
@Query(value = "SELECT NEXTVAL(?1)", nativeQuery = true)
Long getNextSequenceByFleetId(String fleetId);
Run Code Online (Sandbox Code Playgroud)
尽管数据库中的序列设置正确,但它对我不起作用。
SELECT NEXTVAL(F0001) --> returns nextval 2
Run Code Online (Sandbox Code Playgroud)
我在这里缺少什么?
谢谢。
PS:我看到了这篇文章,但示例没有使用@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);
Run Code Online (Sandbox Code Playgroud)
我尝试过以下方法:
@Query(value = "SELECT NEXTVAL(?#{[0]})", nativeQuery = true)
Long getNextSequenceByFleetId(String fleetId);
Run Code Online (Sandbox Code Playgroud)
可惜...
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
Run Code Online (Sandbox Code Playgroud)
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);
Run Code Online (Sandbox Code Playgroud)
这是为了在多个存储库继承的接口中使用,可能对您没有真正的帮助。
您可能可以做的是调用一个存储过程,该过程根据参数对序列执行查询。
| 归档时间: |
|
| 查看次数: |
16831 次 |
| 最近记录: |