java - 从使用 3 个相同的 SQL 参数转换为 1 个

标签 java sql mysql spring-security

我使用 Java spring 框架来确保安全。我预先存在的表布局与 spring 的预期不同,但我可以在 jdbc-user-service 上指定自定义的按用户名权限查询。问题在于该查询只需要 SQL 语句中的单个参数 (?)。基本上,如果用户存在于用户表中,他们应该获得“ROLE_USER”。如果它们在 auth 表中作为“S”存在,则它们应该获得“ROLE_USER”、“ROLE_LICENSEE”和“ROLE_SYSADMIN”。如果它们在身份验证表中以“L”形式存在,则它们应该同时获得“ROLE_LICENSEE”和“ROLE_USER”。

SELECT U.email AS 'username', 'ROLE_USER' AS 'authority' FROM users U WHERE U.email=**?**
UNION
SELECT U.email AS 'username', 'ROLE_LICENSEE' AS 'authority' 
  FROM users U, auth_sys A 
 WHERE U.user_id=A.user_id AND A.auth_type IN ('L', 'S') AND U.email=**?**
UNION
SELECT U.email AS 'username', 'ROLE_ADMIN' AS 'authority' 
  FROM users U, auth_sys A 
 WHERE U.user_id=A.user_id AND A.auth_type='S' AND U.email=**?**;

我的问题是如何将其从 3 (?) 减少到 1?

最佳答案

由于您已经在使用 Spring 框架,因此您也可以使用 Spring 框架进行 JDBC 调用。 Spring框架有一个NamedParameterJdbcTemplate它允许您命名 JDBC 参数。因此,您可以创建一个名为 :emailAddress 的命名参数,并在 SQL 中使用同一参数三次,但仅将其传递到模板中一次。

关于java - 从使用 3 个相同的 SQL 参数转换为 1 个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3112941/

相关文章:

MySQL 复杂内连接

mysql - SQL Join,包括表 a 中的行,但表 b 中没有匹配项

java - 以编程方式创建的 AWS EC2 实例未显示在浏览器中

java - 两个属性的 xpath

java - Android 中加密文本时解密返回空字符串

sql - 是否有单个 SQL(或其变体)函数可以一次检查多个列的不等于?

java - 完成测试后,chrome 浏览器不会关闭

php - MySqLi 由于某种原因无法工作

mysql - 错误 2003 (HY000) : Can't connect to MySQL server on '23.23.*.*' (110)

php - 如何根据数据库查询加载特定文件/url