我正在尝试通过postgresql DB从我的应用程序查询数据。我想要实现的是来自“用户”,其中“用户名”=“stackoverflow”
如果此查询是在SQl编辑器中编写并运行的,则会给出预期结果。
因此,我试图以相同的格式发送查询,如
String SQL_QUERY = "from " + "\"Users\"" + " where "
+ "Username" + "=" + "'"
+ request.getParameter("username") + "'";
当我运行它时,我收到以下错误: 意外字符:'''[来自“用户”的用户名= user1]
如果我删除双引号,它就不起作用,说表名用户不存在。 解决这个僵局的方法是什么?我哪里错了?
谢谢。
答案 0 :(得分:1)
这应该是你想要的:
String username = request.getParameter("username");
String SQL_QUERY = "SELECT * FROM \"Users\" WHERE \"Username\" ='" + username + "'";
您可以通过
进行检查System.out.println(SQL_QUERY);
打印
SELECT * FROM "Users" WHERE "Username" ='foo'
注意/危险:此语句将解决PostgreSQL混合大小写表名和列名的问题。 但以这种方式向查询提供Username
的值会使您容易受到最简单的SQL-Injection攻击。请改用PreparedStatement
并写下
String SQL_QUERY = "SELECT * FROM \"Users\" WHERE \"Username\" = ?";
答案 1 :(得分:0)
查询的SELECT
子句在哪里?它必须是这样的:
String SQL_QUERY= "SELECT * FROM Users WHERE Username='" + request.getParameter("username") + "'";
或者像这样:
String SQL_QUERY= "SELECT FirstName, LastName, Email FROM Users WHERE Username='" + request.getParameter("username") + "'";
这是一个非常类似的示例,它使用PreparedStatement来避免SQL注入安全攻击:https://www.owasp.org/index.php/Preventing_SQL_Injection_in_Java
答案 2 :(得分:0)
遵循Postgresql语法最终有助于获得解决方案。将所有列名称更改为小型大写,然后尝试,这解决了大多数问题。感谢A.H
String SQL_QUERY = "FROM Users WHERE username ='" + username + "'";
Query query = objSession.createQuery(SQL_QUERY);
List list = query.list();
for (Iterator it = list.iterator(); it.hasNext();) {
Users objUsers = (Users) it.next();
System.out.println("Username: " + objUsers.userName);
System.out.println("Password: " + objUsers.password);
System.out.println("Name: " + objUsers.name);
}