在JPA查询中转义冒号字符':'

Rob*_*ord 17 mysql jpa jpql

我正在尝试通过使用":"字符的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)

  • 这正是我在寻找所需的东西,以使用:: text将postgres json转义为字符串转换 (2认同)

Pas*_*ent 1

我不知道在查询中转义冒号字符的标准方法,该查询显然被解释为命名参数前缀,从而使查询解析器感到困惑。

我的建议是如果可能的话创建并使用 SQL 函数。根据您的提供程序,可能还有其他选项(例如使用另一个字符并用:拦截器中的 a 替换所选字符),但至少前面的建议将使您的 JPA 代码在提供程序之间保持可移植性。

PS:如果您使用 Hibernate, HHH-1237上附加了一个非常旧的补丁。

更新: JPA 1.0 规范中有一个关于命名参数和本机查询的“有趣”段落:

3.6.3 命名参数

命名参数是一个以“:”符号为前缀的标识符。命名参数区分大小写。

命名参数遵循第 4.4.1 节中定义的标识符规则。 命名参数的使用适用于 Java 持久性查询语言,而不是为本机查询定义的。只有位置参数绑定可以可移植地用于本机查询。

setParameter传递给 API方法的参数名称 Query 不包含“:”前缀。

这不会真正帮助您,但您的情况强烈暗示本机查询中的“:”甚至不应该被考虑(至少没有办法逃避它或禁用它检测)。