Hibernate 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 от Record“ и той работи перфектно, така че знам, че моята версия на 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. Доколкото разбирам, се поддържа само синтаксисът „топ 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 'select top 50 * from build_records' и той работи добре. Проблемът изглежда е, че Hibernate не поставя числото 50 в SQL, когато го генерира. Не мога да си представя, че това би останало неразпознато, освен за мен. - person Joe Ferner; 26.01.2011

Можете да използвате опцията createSQLQuery, която работи с TOP.

person Dwarakanath Jagadeesan    schedule 01.02.2011