【发布时间】:2018-07-05 20:43:07
【问题描述】:
在我当前的 spring 项目中,我已经为我的 UserDetailsService bean 配置了带有这个 SQL 语句的 spring-security xml:
<bean id="userDetailsService" class="org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl">
<property name="dataSource" ref="dataSource"></property>
<property name="usersByUsernameQuery" value="select login, senha, enabled from usuario where login = ?"></property>
<property name="authoritiesByUsernameQuery" value="SELECT t1.username, t2.authority FROM (SELECT u.login as username, c.nome as credencial FROM usuario u, usuario_credencial uc, credencial c WHERE u.id = uc.usuario_id and c.id = uc.credenciais_id) as t1 INNER JOIN (SELECT c.nome as credencial, a.nome as authority FROM credencial c, credencial_autorizacao ca, autorizacao a WHERE c.id = ca.credencial_id and a.id = ca.autorizacoes_id) as t2 ON t1.credencial = t2.credencial WHERE t1.username = ?;"></property>
</bean>
SQL语句:
SELECT t1.username, t2.authority
FROM (
SELECT u.login as username, c.nome as credencial
FROM usuario u, usuario_credencial uc, credencial c
WHERE u.id = uc.usuario_id and c.id = uc.credenciais_id
) as t1
INNER JOIN
(
SELECT c.nome as credencial, a.nome as authority
FROM credencial c, credencial_autorizacao ca, autorizacao a
WHERE c.id = ca.credencial_id and a.id = ca.autorizacoes_id
) as t2
ON t1.credencial = t2.credencial
WHERE t1.username = ?;
当我在 tomcat 上部署和运行应用程序时导致此错误(以下文本来自 postgresql 日志文件):
2018-01-26 07:53:41.644 -03 [20491] postgres@mydata ERROR: syntax error at or near "INNER" at character 160
2018-01-26 07:53:41.644 -03 [20491] postgres@mydata STATEMENT: (SELECT u.login as username, c.nome as credencial FROM usuario u, usuario_credencial uc, credencial c WHERE u.id = uc.usuario_id and c.id = uc.credenciais_id) INNER JOIN (SELECT c.nome as credencial, a.nome as authority FROM credencial c, credencial_autorizacao ca, autorizacao a WHERE c.id = ca.credencial_id and a.id = ca.autorizacoes_id)
2018-01-26 07:54:52.882 -03 [20491] postgres@mydata ERROR: syntax error at or near "as" at character 160
2018-01-26 07:54:52.882 -03 [20491] postgres@mydata STATEMENT: (SELECT u.login as username, c.nome as credencial FROM usuario u, usuario_credencial uc, credencial c WHERE u.id = uc.usuario_id and c.id = uc.credenciais_id) as t1 INNER JOIN (SELECT c.nome as credencial, a.nome as authority FROM credencial c, credencial_autorizacao ca, autorizacao a WHERE c.id = ca.credencial_id and a.id = ca.autorizacoes_id) as t2
2018-01-26 07:55:14.275 -03 [20491] postgres@mydata ERROR: syntax error at or near "INNER" at character 158
2018-01-26 07:55:14.275 -03 [20491] postgres@mydata STATEMENT: SELECT u.login as username, c.nome as credencial FROM usuario u, usuario_credencial uc, credencial c WHERE u.id = uc.usuario_id and c.id = uc.credenciais_id INNER JOIN SELECT c.nome as credencial, a.nome as authority FROM credencial c, credencial_autorizacao ca, autorizacao a WHERE c.id = ca.credencial_id and a.id = ca.autorizacoes_id
2018-01-26 07:56:55.362 -03 [20520] postgres@mydata ERROR: syntax error at or near "as" at character 160
2018-01-26 07:56:55.362 -03 [20520] postgres@mydata STATEMENT: (SELECT u.login as username, c.nome as credencial FROM usuario u, usuario_credencial uc, credencial c WHERE u.id = uc.usuario_id and c.id = uc.credenciais_id) as t1 INNER JOIN (SELECT c.nome as credencial, a.nome as authority FROM credencial c, credencial_autorizacao ca, autorizacao a WHERE c.id = ca.credencial_id and a.id = ca.autorizacoes_id) as t2 ON t1.credencial = t2.credencial
谁能给我提示一下是什么导致了这个错误?
【问题讨论】:
-
没有具体导致错误,但混合逗号连接和
JOIN语法使其难以解析。至少对我来说。 -
不相关,但是:为什么在派生表中使用古老而过时的隐式连接,而在它们之间使用现代显式连接运算符?
-
查询看起来很好,如果你在SQL客户端手动运行它是否有效?
-
@a_horse_with_no_name 是的,我在 pgAdmin3 中运行它。另外,句子执行没有错误。当我尝试完整的句子时(只需复制并粘贴上面的代码,就会出错)。
-
credential是SELECTs 的一部分,会考虑只使用一个涉及所有 5 个表的大型联接,而不是 2x3。使整个查询更易于阅读和理解。
标签: java sql spring postgresql inner-join