无法从java正确构建SQL查询

时间:2012-02-11 20:16:55

标签: sql string hibernate postgresql double-quotes

我正在尝试通过postgresql DB从我的应用程序查询数据。我想要实现的是来自“用户”,其中“用户名”=“stackoverflow”

如果此查询是在SQl编辑器中编写并运行的,则会给出预期结果。

因此,我试图以相同的格式发送查询,如

String SQL_QUERY = "from " + "\"Users\"" + " where " + "Username" + "=" + "'" + request.getParameter("username") + "'";

当我运行它时,我收到以下错误: 意外字符:'''[来自“用户”的用户名= user1]

如果我删除双引号,它就不起作用,说表名用户不存在。 解决这个僵局的方法是什么?我哪里错了?

谢谢。

3 个答案:

答案 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);
        }