Получение неожиданной ошибки токена в SQL-запросе - PullRequest
0 голосов
/ 03 октября 2019

org.hibernate.hql.internal.ast.QuerySyntaxException: неожиданный токен: TOP рядом со строкой 1, столбцом 8 [SELECT TOP 10 IServe.ID FROM TopUp.dbo.IServe WHERE ExpireDate> = '2019-10-03 'И TelcoID =' 2 'И ProductID =' 2 'И RechargeAmt =' 100.0 'И Доступно = 1 ЗАКАЗ ПО 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();

Можете ли вы помочь мне с этой ошибкой. Я застрял здесь

Ответы [ 2 ]

1 голос
/ 03 октября 2019

Хотя ваш запрос трудно прочитать, и вы должны использовать подготовленное утверждение, я не вижу ничего плохого в синтаксисе. Таким образом, ошибка, вероятно, происходит, потому что 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();
}
0 голосов
/ 03 октября 2019

Поскольку не понятно, к какому типу относятся ваши переменные, попробуйте просмотреть данные самостоятельно. Если в параметре есть строковые значения, содержащие специальные символы, сначала удалите их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...