参数前缀 ':' 后不允许有空格

Posted

技术标签:

【中文标题】参数前缀 \':\' 后不允许有空格【英文标题】:Space is not allowed after parameter prefix ':'参数前缀 ':' 后不允许有空格 【发布时间】:2015-04-10 00:24:47 【问题描述】:

我的问题是我尝试在查询中插入包含 char : 的文本

我尝试在 char : 之前添加双反斜杠 // 但仍然无法正常工作。

ABNORMALLY.java.lang.IllegalArgumentException: 
org.hibernate.QueryException: Space is not allowed after parameter prefix ':' 

INSERT INTO TABLE_A  (A_ID, TYPE_ID, F_ID, REFNO, RECORD) VALUES 
( A_ID_SEQ.nextval, 4 , 9 , 'NY167', q'[LA2010167|SNIP' N CLIP|LMG|1.Unit no\\: 1046, 1 st Floor, Limbang Plaza, 98700 Limbang|2010-12-10||]')

【问题讨论】:

将查询用单引号括起来似乎是错误的。这是在什么背景下出现的? 这里回答了类似的问题***.com/a/9461939/4454454 @NathanHughes 我只是更新信息。没有单引号用于括起查询。这是我将查询放入 log.info() @MaxZoom 以一种方式使用拦截器,但我真的不知道如何编码。我更喜欢其他更快的方式,例如添加额外的双反斜杠以使其工作。 将值作为参数添加而不是硬编码不是更容易吗?这样,当 hibernate 解析这个寻找命名参数时,它们就会不受影响。 【参考方案1】:

根据我的经验,我会告诉你。有两种情况 1) 您想在查询中指定一个参数,其值是动态设置的。

eg: where user_id = :userId

如果您设置与“userId”同名的参数,您将不会遇到任何问题; 2) 您正在对值进行类型转换

eg: select count(id) :: integer

当你这样做时,你必须使用转义字符,否则 hibernate 会认为它是一个参数。而且会报错"All parameters are not set" 你可以通过使用转义字符编写代码来克服这个问题

eg:select count(id) \\:\\: integer

所以这将解决您的问题。 如果你错误地使用了正斜杠而不是反斜杠,你会得到错误"space is not allowed after prefix"

Wrong: select count(id)//://: integer
Right: select count(id)\\:\\: integer

但我强烈建议你使用 CAST 函数而不是使用 "::" 这个运算符 即select CAST(count(id) as integer) 这是更好的类型转换方法,并且会导致最小的错误

【讨论】:

我在 mysql 中的分配有问题:@current_client_user_id := client_user_id【参考方案2】:

这里 Hibernate 正在解析一个包含硬编码值的插入,其中包含一个冒号。如果您重写插入以使用参数,那么 Hibernate 不会将值视为语句的一部分。

【讨论】:

【参考方案3】:

我没有通过Spring Boot解决这个问题,我创建了一个函数(实际上是一个过程)并将其用作查询,问题已经解决。

【讨论】:

【参考方案4】:

问题是您的 RECORD 列包含“:”,因此,Hibernate 等待它后面的参数。 我也遇到过你的问题

【讨论】:

所以帮助这个人解决问题

以上是关于参数前缀 ':' 后不允许有空格的主要内容,如果未能解决你的问题,请参考以下文章

excel表格怎么在一列加前缀

HTML 锚电话标记格式

html 前缀表单元格包含:伪元素

索引常识

从行上的单元格值添加前缀

允许用户删除拥有的前缀数据库