参数前缀 ':' 后不允许有空格
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 等待它后面的参数。 我也遇到过你的问题
【讨论】:
所以帮助这个人解决问题以上是关于参数前缀 ':' 后不允许有空格的主要内容,如果未能解决你的问题,请参考以下文章