【问题标题】:Getting unexpected Token error in sql query在 sql 查询中出现意外的 Token 错误
【发布时间】:2020-02-01 07:38:21
【问题描述】:

org.hibernate.hql.internal.ast.QuerySyntaxException:意外令牌:第 1 行第 8 列附近的 TOP [SELECT TOP 10 IServe.ID FROM TopUp.dbo.IServe WHERE ExpireDate >= '2019-10-03' AND TelcoID = '2' AND ProductID = '2' AND RechargeAmt = '100.0' AND Available = 1 ORDER BY ExpireDate, SN]

String query3 = "SELECT TOP " + importStockList.getOrderQuantity() +" IServe.ID FROM IServe WHERE "
            + " ExpireDate >= '" + sqlDate + "' " + " AND TelcoID = '" + importStockList.getTelcoId()
            + "' AND ProductID = '" + importStockList.getProductId() + "' AND " + "RechargeAmt = '"
            + importStockList.getRechargeAmt() + "' AND Available = 1 ORDER BY ExpireDate, SN" ;

    Session hbsessionSQL = HibernateUtilSQL.getSessionFactory().openSession();
    List<Iserve> iserve = hbsessionSQL.createQuery(query3).list();

你能帮我解决这个错误吗?我被困在这里了

【问题讨论】:

  • HQL 不支持“TOP”(或一般的 SQL 语法 - 这就是为什么它被称为 HQL 而不是 SQL)。
  • 不应该是select .... LIMIT 1吗?
  • 您是否考虑过在语句末尾使用LIMIT 10 而不是在开头使用TOP 10
  • 即使在使用 LIMIT 之后,我仍然遇到同样的错误。仅供参考,我正在使用 SQL 数据库

标签: java sql hibernate


【解决方案1】:

虽然您的查询难以阅读,并且您应该使用准备好的语句,但我认为语法本身没有任何错误。所以错误可能是因为TOP 不是有效的 HQL 语法而发生的。 TOP 实际上只支持 Microsoft 数据库,例如 SQL Server 或 Access。尝试改用LIMIT

try {
    Session session = HibernateUtilSQL.getSessionFactory().openSession();
    Connection conn = session.connection();
    String sql = "SELECT ID FROM IServe WHERE ExpireDate >= ? AND TelcoID = ? AND ProductID = ? AND RechargeAmt = ? AND Available = 1 ORDER BY ExpireDate, SN LIMIT ?";
    PreparedStatement ps = conn.prepareStatement(sql);
    ps.setDate(1, sqlDate);
    ps.setInt(2, importStockList.getTelcoId());
    ps.setInt(3, importStockList.getProductId());
    ps.setInt(4, importStockList.getRechargeAmt());
    ps.setInt(5, importStockList.getOrderQuantity());
    ResultSet rs = ps.executeQuery();

    while(rs.next()) {
        // process result set here
    }
}
catch(HibernateException e) {
    e.printStackTrace();
}

【讨论】:

    【解决方案2】:

    由于不了解您的变量是什么类型,请尝试自己查看数据。如果有选项字符串值包含特殊字符,请先将其删除。

    【讨论】:

      猜你喜欢
      • 2011-07-17
      • 2018-10-22
      • 1970-01-01
      • 1970-01-01
      • 2017-11-06
      • 1970-01-01
      • 1970-01-01
      • 2021-01-25
      • 1970-01-01
      相关资源
      最近更新 更多