我正在尝试通过使用":"字符的JPA运行本机查询.特定实例在查询中使用MySQL用户变量:
SELECT foo, bar, baz,
@rownum:= if (@id = foo, @rownum+1, 1) as rownum,
@id := foo as rep_id
FROM
foo_table
ORDER BY
foo,
bar desc
Run Code Online (Sandbox Code Playgroud)
JPA代码:
Query q = getEntityManager().createNativeQuery(query, SomeClass.class);
return q.getResultList();
Run Code Online (Sandbox Code Playgroud)
但是,这给了我一个例外,即不允许用空格跟随':'.我已经尝试用反斜杠逃避它们,我已经尝试通过将它们加倍来逃避它们.有没有办法真正做到这一点,还是我是SOL?
小智 50
在本机JPA查询中使用postgresql json函数时,我遇到了类似的经历.
select * from component where data ::json ->> ?1 = ?2
Run Code Online (Sandbox Code Playgroud)
JPA将抛出我没有设置命名参数的错误:json.
解决方案:
select * from component where data \\:\\:json ->> ?1 = ?2
Run Code Online (Sandbox Code Playgroud)
我不知道在查询中转义冒号字符的标准方法,该查询显然被解释为命名参数前缀,从而使查询解析器感到困惑。
我的建议是如果可能的话创建并使用 SQL 函数。根据您的提供程序,可能还有其他选项(例如使用另一个字符并用:拦截器中的 a 替换所选字符),但至少前面的建议将使您的 JPA 代码在提供程序之间保持可移植性。
PS:如果您使用 Hibernate, HHH-1237上附加了一个非常旧的补丁。
更新: JPA 1.0 规范中有一个关于命名参数和本机查询的“有趣”段落:
3.6.3 命名参数
命名参数是一个以“:”符号为前缀的标识符。命名参数区分大小写。
命名参数遵循第 4.4.1 节中定义的标识符规则。 命名参数的使用适用于 Java 持久性查询语言,而不是为本机查询定义的。只有位置参数绑定可以可移植地用于本机查询。
setParameter传递给 API方法的参数名称Query不包含“:”前缀。
这不会真正帮助您,但您的情况强烈暗示本机查询中的“:”甚至不应该被考虑(至少没有办法逃避它或禁用它检测)。
| 归档时间: |
|
| 查看次数: |
10705 次 |
| 最近记录: |