Спящий режим setMaxResults () не работает для запроса базы данных Sybase

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

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

or

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.


person Joe Ferner    schedule 26.01.2011    source источник


Ответы (4)


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

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

См. также:

person axtavt    schedule 26.01.2011
comment
Как неловко. Вы совершенно правы. Мы использовали HSQLDialect. Кто-то другой настроил файл hibernate.cfg.xml, поэтому я всегда просто предполагал, что это правильно. Мы уже много лет работаем над тем, чтобы не иметь возможности установить ограничения в нашем проекте. Большое спасибо. Теперь, когда мы используем SybaseDialect, это прекрасно работает. - person Joe Ferner; 26.01.2011

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

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

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

person VoodooChild    schedule 26.01.2011
comment
Спасибо за ответ! Да, та же ошибка. Я полагаю, что другие нашли эту проблему, но я не могу найти никого, кто бы жаловался. - person Joe Ferner; 26.01.2011
comment
Интересно, что когда я делаю именно так, как вы просили выше, Hibernate превращает это в SQL в следующее: select limit ? ? record_id и т. д. Я знаю, что НЕ работает в Sybase. Насколько я понимаю, поддерживается только синтаксис "top 50". Но ошибка, которую я получаю, все та же, потому что я думаю, что она жалуется на '?' который он интерпретирует как @p0, который, я полагаю, является некоторой внутренней переменной Hibernate. - person Joe Ferner; 26.01.2011

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

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

person fmucar    schedule 26.01.2011
comment
Я ценю информацию. Я знаю, как использовать методы. Все, что меня интересует, это решить эту легко воспроизводимую проблему. Я займусь пейджингом и инкрементной выборкой позже. Я пытался использовать эти методы вместе с setMaxResults, и я продолжаю получать ту же проблему. - person Joe Ferner; 26.01.2011
comment
это ? исходит из подготовленного заявления, как вы уже знаете. Там должно быть число 50, прежде чем выполнять sql. Возможно, у используемого вами драйвера jdbc есть какие-то проблемы/ошибки? - person fmucar; 26.01.2011
comment
Не проблема с драйвером JDBC, потому что я могу использовать тот же драйвер для выполнения простого sql «выбрать 50 лучших * из build_records», и он отлично работает. Похоже, проблема в том, что Hibernate не помещает число 50 в SQL при его генерации. Не могу представить, что это осталось бы незамеченным, если бы не я. - person Joe Ferner; 26.01.2011

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

person Dwarakanath Jagadeesan    schedule 01.02.2011