我使用下面的代码检查代码是否存在,如果没有相同的代码,executeQuery()没有任何问题。
public boolean isExist(String code) throws DataBaseException {
boolean isExist = false;
StringBuffer querySql = new StringBuffer();
querySql.append(" SELECT ");
querySql.append(" MY_CODE ");
querySql.append(" FROM ");
querySql.append(" MY_MST ");
querySql.append(" WHERE ");
querySql.append(" MY_CODE = ? ");
try {
super.setQuerySql(querySql.toString());
super.addParameter(Types.VARCHAR, code);
List<Object> resultsList = super.executeQuery();
if (resultsList != null && resultsList.size() > 0) {
isPsiExist = true;
}
} catch (Exception e) {
throw new DataBaseException(e, "Can't get the code.", this.getClass().getName(), querySql.toString());
}
return isExist;
}
但如果代码存在,那么ORA-00904就发生了,有人告诉我为什么吗?我该如何解决这个问题?
org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [ SELECT MY_CODE FROM MY_MST WHERE MY_CODE = ? ]; nested exception is java.sql.SQLException: invalid identifier.
答案 0 :(得分:0)
您似乎对如何在JDBC中使用预准备语句感到困惑,尽管您尝试使用预准备语句肯定是在正确的轨道上。您应该使用以下模式:
String sql = "SELECT CODE FROM MY_MST WHERE CODE = ?";
try {
PreparedStatement ps = dbConnection.prepareStatement(sql);
ps.setString(1, code);
ResultSet rs = ps.executeQuery();
while (rs.next()) {
// process the current row
}
}
catch (SQLException e) {
// handle exception
}
答案 1 :(得分:0)
您似乎将自己的班级用于PreparedStatement
:
super.setQuerySql(querySql.toString());
super.addParameter(Types.VARCHAR, code);
List<Object> resultsList = super.executeQuery();
问题是
super.addParameter(Types.VARCHAR, code);
它没有设置参数。
但是,由于你没有表现出来,要提供更具体的答案并不容易。
无论如何,不要试图重新发明有效的东西。使用完成工作的PreparedStatement
。
如果真的很有用,你可以使用一个包含它的包装类,但主要依赖它来进行查询并利用它们的结果。
答案 2 :(得分:0)
我找到了错误原因,因为我的mapRow方法使用了多个列,很抱歉给您带来麻烦。
protected Object mapRow(ResultSet resultSet, int rowNumber) throws SQLException {
...
psi.setCode(resultSet.getString("MY_CODE"));
psi.setName(resultSet.getString("NAME"));
...
}
现在我修改后就可以了
protected Object mapRow(ResultSet resultSet, int rowNumber) throws SQLException {
...
ResultSetMetaData rsmd = resultSet.getMetaData();
int count = rsmd.getColumnCount();
if (count == 1) {
psi.setCode(resultSet.getString("MY_CODE"));
}
else {
psi.setCode(resultSet.getString("MY_CODE"));
psi.setName(resultSet.getString("NAME"));
}
}