Sql 向NativeQuery添加多个参数时出现无效字符异常
我使用Sql 向NativeQuery添加多个参数时出现无效字符异常,sql,jdbc,Sql,Jdbc,我使用JDBC,希望创建一个带有两个参数的NativeQuery,其中一个是String,另一个是int。当我尝试这样做时: import javax.persistence.EntityManager; ... private final EntityManager entityManager; .... String columnName = "exampleName"; int columnNumber = 5; entityManager.createNativeQuery("SELEC
JDBC
,希望创建一个带有两个参数的NativeQuery
,其中一个是String
,另一个是int
。当我尝试这样做时:
import javax.persistence.EntityManager;
...
private final EntityManager entityManager;
....
String columnName = "exampleName";
int columnNumber = 5;
entityManager.createNativeQuery("SELECT c.TABLE_NAME, c.TCL_NUMBER from COL_NAME c where c.TABLE_NAME " +
"like ?1 and c.TCL_NUMBER like ?2;")
.setParameter(1, columnName)
.setParameter(2, columnNumber)
.getSingleResult();
我得到一个java.sql.SQLSyntaxErrorException:ORA-00911:无效字符
异常。
这是我的SQL:
CREATE TABLE COL_NAME (
TABLE_NAME VARCHAR2(50 BYTE),
TABLE_NUMBER NUMBER(10,0)
);
当我想把<代码> int >代码>作为参数时,我必须考虑一些特殊的东西吗? ,因为您已经发现查询中的问题来自于<代码> 1 和<代码> 2 。这将被编译为如下内容:
SELECT c.TABLE_NAME, c.TCL_NUMBER from COL_NAME c where c.TABLE_NAME like 'val1'1 and c.TCL_NUMBER like 'val2'2
这显然是不正确的sql语法
因此正确的代码应该是:
entityManager.createNativeQuery("SELECT c.TABLE_NAME, c.TCL_NUMBER from COL_NAME c where c.TABLE_NAME " +
"like ? and c.TCL_NUMBER = ? ")
.setParameter(1, columnName)
.setParameter(2, columnNumber)
.getSingleResult();
AFAIK不支持对数字使用like子句。数字不是字符串。哦,这很有意义。我明天会检查这是否是唯一的问题,但我想是的。如果你喜欢,你可以把你的评论作为答案,我会接受的。谢谢此外,不能使用索引(
?1
、?2
等)附加绑定变量。您需要对所有变量使用一个简单的问号(?
),AFAIK。变量的索引是按照它们在查询中出现的顺序隐式指定的。@JB Nizet的注释也是有效的--您不能将数字与类似的进行比较。如果要匹配TABLE_NAME
列的部分字符串,则绑定变量应使用通配符包围,例如:c.TABLE_NAME,如“%”|?| |“%”
(正确的连接运算符取决于RDBMS供应商)。我必须删除?
后面的数字。将数字与进行比较也是错误的,比如
,相反,我必须这样做:。。。c、 TCL_编号=?
如@JB Nizet所述。