Hibernate setMaxResults () не работает для запроса к базе данных Sybase - PullRequest
2 голосов
/ 26 января 2011

Любой из следующих двух подходов к выполнению простого запроса Hibernate с ограниченными результатами не работает в Sybase.Они оба приводят к SybSQLException: неправильный синтаксис рядом с'@p0'.

Query q = session.createQuery( "from Record" );
q.setMaxResults( 50 );
q.list();

или

Criteria criteria = session.createCriteria( Record.class );
criteria.setMaxResults( 50 );
criteria.list();

Похоже, фактический SQL, сгенерированный в обоихпадеж выглядит как ...

select top ? record_id, etc...

и Sybase балансирует на?, который Hibernate не заполняет значением 50 (это мое предположение).Я искал везде, и в то время как другие столкнулись с подобной ошибкой, это не было связано с попыткой ограничить результаты.

Я могу выполнить прямой оператор SQL, такой как «выбрать топ 50 из записи», и он отлично работает, поэтому я знаю, что моя версия Sybase поддерживает синтаксис.

Я использую Hibernate 3.2и Sybase ASE 15.0.2

Ответы [ 4 ]

6 голосов
/ 26 января 2011

Возможно, вы настроили Hibernate для использования неправильного диалекта SQL.

Похоже, HSQLDialect - единственный диалект, который может производить limit ? ?, и это определенно неправильный выбор для Sybase.

Смотри также:

0 голосов
/ 01 февраля 2011

Вы можете использовать опцию createSQLQuery, которая работает с TOP.

0 голосов
/ 26 января 2011

setMaxResults() обычно используется вместе с setFirstResult() для реализации подкачки. Например. первый запрос возвращает записи от 1 до 1000, второй запрос возвращает от 1001 до 2000 и т. д. Попробуйте использовать вместе.

setFetchSize() контролирует, сколько строк выбирается драйвером JDBC за один раз (если реализовано). Так, если, например, у вас есть setMaxResults (1000) и setFetchSize (100), запрос вернет не более 1000 строк, и будет делать это партиями по 100 строк за раз.

0 голосов
/ 26 января 2011

Попробуйте ввести setFirstResult(1), например:

Criteria criteria = session.createCriteria(Record.class);
criteria.setFirstResult(1);
criteria.setMaxResults(50);
criteria.list();

Вы все еще получаете ту же ошибку?

...