向 NativeQuery 添加多个参数时出现无效字符异常
Invalid character Exception when adding multiple parameters to NativeQuery
我使用 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: invalid character
异常。
这是我的 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();
我使用 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: invalid character
异常。
这是我的 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();