【问题标题】:Unable to frame sql query correctly from java无法从 java 正确构建 sql 查询
【发布时间】:2012-02-12 05:26:09
【问题描述】:

我正在尝试通过 postgresql DB 从我的应用程序中查询数据。我想要实现的是来自 "Users" where "Username"='stackoverflow'

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

因此,我尝试以与

相同的格式发送查询

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

当我运行它时,我收到以下错误: unexpected char: '"' [来自“Users” where Username=user1]

如果我删除双引号,它将不起作用,表示名为 users 的表不存在。 摆脱这种僵局的出路是什么?我哪里错了??

谢谢。

【问题讨论】:

  • 这不是强制性的。不用select也可以装帧 *

标签: sql string hibernate postgresql double-quotes


【解决方案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\" = ?";

【讨论】:

  • 错误:SQL_QUERY-->SELECT * FROM "Users" WHERE "Username" ='user1' Feb 12, 2012 2:11:46 AM org.hibernate.hql.ast.ErrorCounter reportError SEVERE: *** 错误:第 1:8 行:意外令牌:* 意外字符:'"' [SELECT * FROM "Users" WHERE "Username" ='user1']
  • Withough select *, error: SQL_QUERY-->FROM "Users" WHERE "Username" ='user1' unexpected char: '"' [FROM "Users" WHERE "Username" ='user1']
  • hibernate 部分告诉我,您没有使用 SQL。这也可以解释缺少的SELECT ... 部分。对吗?
  • 它正在使用的 HSQL。休眠 SQL
  • HSQL 不是 SQL,它被翻译成SQL并且有自己的语法。所以...您有任何映射文件 (*.hbm.xml) 或使用任何注释来进行映射吗?如果是这样,请通过显示它们并将 Hibernate 正式带入游戏来编辑您的问题。
【解决方案2】:

查询的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

【讨论】:

  • 即使指定所有列而不是 * 也无济于事。
  • 当我按照您的建议构建 wuery 时遇到的错误。 :: 严重:错误:关系“用户”不存在位置:126 无法执行查询
  • 如果我给“Users”加上双引号,那么我会得到错误:: unexpected char: '"' [from "Users" where Username = 'user1']。我对如何继续感到困惑执行此查询。
  • 使用 createNativeQuery() 而不是 createQuery() 为我修复了它
【解决方案3】:

遵循 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);
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多