【发布时间】:2020-08-11 23:48:00
【问题描述】:
我正在使用 spring security 4,我输入的查询似乎不起作用,即使它在 PL/SQL 中正常工作。
我想访问ROLETYPE 表。这些表与主键和外键链接,例如:UTILISATEURS 有POSTES 有ROLES 有RHNOM(这是角色类型LIB1)
这是查询:
authorities-by-username-query="select LIB1 from RHNOM rh, UTILISATEURS u, POSTES p, ROLES r
where u.IDPOSTE = p.ID_POSTE and p.ID_ROLE = r.ID_ROLE and r.ID_TYP_ROLE = rh.IDNOM and u.LOGIN = ?" />
错误:
Caused by: org.springframework.jdbc.InvalidResultSetAccessException: PreparedStatementCallback; invalid ResultSet access for SQL [select LIB1 from RHNOM rh, UTILISATEURS u, POSTES p, ROLES r where u.IDPOSTE = p.ID_POSTE and p.ID_ROLE = r.ID_ROLE and r.ID_TYP_ROLE = rh.IDNOM and u.LOGIN = ?]; nested exception is java.sql.SQLException: Index de colonne non valide
at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:235)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:660)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:695)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:727)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:737)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:787)
at org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl.loadUserAuthorities(JdbcDaoImpl.java:236)
at org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl.loadUserByUsername(JdbcDaoImpl.java:188)
at org.springframework.security.authentication.dao.DaoAuthenticationProvider.retrieveUser(DaoAuthenticationProvider.java:114)
... 34 more
Caused by: java.sql.SQLException: Index de colonne non valide
at oracle.jdbc.driver.OracleResultSetImpl.getString(OracleResultSetImpl.java:1277)
at org.apache.commons.dbcp.DelegatingResultSet.getString(DelegatingResultSet.java:213)
at org.apache.commons.dbcp.DelegatingResultSet.getString(DelegatingResultSet.java:213)
at org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl$2.mapRow(JdbcDaoImpl.java:240)
at org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl$2.mapRow(JdbcDaoImpl.java:237)
at org.springframework.jdbc.core.RowMapperResultSetExtractor.extractData(RowMapperResultSetExtractor.java:93)
at org.springframework.jdbc.core.RowMapperResultSetExtractor.extractData(RowMapperResultSetExtractor.java:60)
at org.springframework.jdbc.core.JdbcTemplate$1.doInPreparedStatement(JdbcTemplate.java:708)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:644)
... 41 more
【问题讨论】:
-
能否贴出你如何设置输入值、执行然后访问结果集的代码?
-
@Sujitmohanty30 有问题的代码不是来自 OP,而是来自 Spring Security 库。
-
@Mark Rotteveel:正如您所见,OP 有自己的查询来获取要应用的角色详细信息,如果我理解的话,无效索引的错误与此 SQL 相关。这就是为什么我要问如何设置查询的输入参数,这可能是无效索引错误的原因之一。
-
@Sujitmohanty30 错误在于检索列而不是设置参数,如异常堆栈跟踪所示。该查询的执行仍由 Spring Security 处理。问题是 - 如我的回答所示 - OP 的查询与 Spring Security 的预期不匹配,即角色位于查询的第二列(OP 的查询只有一列)。
-
@Mark Rotteveel:理解并感谢您。我更像是一个 oracle sql 人,对 spring 和 java 比 java 更陌生,所以思考过程也是一样的。
标签: java oracle jdbc spring-jdbc