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

时间:2015-02-10 03:46:09

标签: java oracle hibernate

我的问题是我尝试在我的查询中插入包含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||]')

3 个答案:

答案 0 :(得分:7)

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

eg: where user_id = :userId

如果您要设置与" userId&#34 ;;相同名称的参数,那么您不会遇到任何问题。
2)你正在对值进行类型转换

eg: select count(id) :: integer

当你这样做时你必须使用转义字符,否则hibernate会认为它是一个参数。并且它会给出错误"所有参数都没有设置" 您可以使用转义字符

编写代码来解决这个问题
eg:select count(id) \\:\\: integer

所以这将解决您的问题。 如果您错误地使用正斜杠而不是反斜杠,您将收到错误"前缀后不允许空格"

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

但我强烈建议您使用CAST功能,而不是使用"::"此运算符 即select CAST(count(id) as integer) 这是更好的类型转换方式,它将导致最小的错误

答案 1 :(得分:5)

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

答案 2 :(得分:-1)

问题是你的RECORD列包含“:”,因此,Hibernate会在它之后等待一个参数。 我讨厌你的问题