IntelliJ提示PostgreSQL无法解析user表,库中已存表但编译器无访问权限如何解决
排查及解决步骤
1. 修复IntelliJ SQL解析绑定配置
- 打开IntelliJ的
File > Settings > Languages & Frameworks > SQL Resolution Scopes - 确认当前项目/模块绑定的数据源,和你在Database面板里连接的PostgreSQL数据源一致
- 如果是多数据源项目,单独给编写SQL的模块指定对应数据源即可,绑定后IntelliJ就能识别对应库的表结构
2. 核对表名与保留字冲突
user是PostgreSQL的内置保留字,如果你实际的表名确实为user,需要用双引号包裹表名才能正常识别,SQL写法参考:
SELECT users, password FROM "user" WHERE users = ?
如果你实际建表的表名是users,请检查所有SQL语句中是否存在把表名误写为user的情况,拼写不一致也会触发该报错。
3. 修复缓存识别异常
如果上述配置都正确,大概率是IntelliJ本地索引损坏导致的识别异常:
- 点击
File > Invalidate Caches... - 勾选「Clear file system cache and local history」后重启IDE,重启后等待索引重建完成即可恢复识别
4. 修正代码中的逻辑错误
你贴出的代码存在三处明显的SQL执行逻辑错误,会导致运行时报错:
- 不需要提前调用
executeUpdate():该方法仅用于执行增、删、改操作,查询类语句直接调用executeQuery()即可 - 预处理语句执行不需要重复传入SQL:
prepareStatement已经绑定了SQL和参数,直接调用无参的executeQuery()即可,传入SQL会跳过参数绑定执行静态语句 - 读取
ResultSet前需要先调用rs.next()移动游标到有效行
修正后的代码参考:
public void getUser(String user) { connect(); String SQL = "SELECT users , password FROM users WHERE users = ?"; try { pstmt = connection.prepareStatement(SQL); pstmt.setString(1, user); ResultSet rs = pstmt.executeQuery(); if (rs.next()) { System.out.println(rs.getString("password")); } } catch (SQLException ex) { System.out.println(ex.getMessage()); } }
内容的提问来源于stack exchange,提问作者Rafal Graczykowski
相关产品推荐
相关产品推荐

