【问题标题】:SQL sentence causes error when executed from Java/Spring Project从 Java/Spring 项目执行 SQL 语句时出错
【发布时间】:2018-07-05 20:43:07
【问题描述】:

在我当前的 spring 项目中,我已经为我的 UserDetailsS​​ervice 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 中运行它。另外,句子执行没有错误。当我尝试完整的句子时(只需复制并粘贴上面的代码,就会出错)。
  • credentialSELECTs 的一部分,会考虑只使用一个涉及所有 5 个表的大型联接,而不是 2x3。使整个查询更易于阅读和理解。

标签: java sql spring postgresql inner-join


【解决方案1】:

提出一个更简单的查询:

SELECT u.login as username, a.nome as authority
FROM usuario u
JOIN usuario_credencial uc     ON u.id = uc.usuario_id
JOIN credencial c              ON c.id = uc.credenciais_id
JOIN credencial_autorizacao ca ON c.id = ca.credencial_id
JOIN autorizacao a             ON a.id = ca.autorizacoes_id
WHERE u.login = ?;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-24
    • 1970-01-01
    • 2015-04-27
    • 2018-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-06
    相关资源
    最近更新 更多