Spring, Hibernate, mySQL : ошибка при вызове setMaxResults
работаю со Spring, Hibernate и mySQL 5.
mysql-connector-java-5.1.7
В общем вопрос в следующем: мне нужно сделать запрос:
Код:
SELECT * FROM myTable LIMIT 10
Я пишу следующее:
Код:
public List<MyTable> getMyData()
{
return (List) getHibernateTemplate().execute(
new HibernateCallback() {
public Object doInHibernate(Session s)
throws HibernateException {
Query query = s.createQuery("select p from Poems p");
query.setMaxResults(2);
return query.list();
}
});
}
{
return (List) getHibernateTemplate().execute(
new HibernateCallback() {
public Object doInHibernate(Session s)
throws HibernateException {
Query query = s.createQuery("select p from Poems p");
query.setMaxResults(2);
return query.list();
}
});
}
В итоге получаю ошибку:
org.springframework.dao.InvalidDataAccessResourceUsageException: could not execute query; nested exception is org.hibernate.exception.SQLGrammarException: could not execute query
и
com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '2 poems0_.Id_poem as Id1_1_, poems0_.PoemTitle as PoemTitle1_, poems0_.PoemText ' at line 1
но если query.setMaxResults закомментировать, то всё работает!
Гугл, ничего внятного не выдаёт: на форумах встречаю в основном следующее «It's a combined bug between MySQL and the MySql JDBC driver».
Только что делать дальше, не знаю. Подскажите пожалуйста, как можно избавиться от этой ошибки. Или как её обойти можно. :(
на mysql есть такой баг... но он датирован 2005 годом. я думаю, его должны были бы починить уже...
по-моему не починили :( или я что-то делаю не так :confused:
так что буду благодарна любому совету :(
судя по всему, SQL выражение он какое-то составляет. покажи этот запрос - он в логах должен быть, если show_sql у хибера в true стоит
судя по всему, SQL выражение он какое-то составляет. покажи этот запрос - он в логах должен быть, если show_sql у хибера в true стоит[/QUOTE]
Hibernate: select top ? poems0_.Id_poem as Id1_1_, poems0_.PoemTitle as PoemTitle1_, poems0_.PoemText as PoemText1_, poems0_.Author as Author1_, poems0_.WhoAdded as WhoAdded1_, poems0_.AdditionDate as Addition6_1_, poems0_.RedactDate as RedactDate1_ from Poems poems0_
а если ещё такую функцию добавить query.setFirstResult(1), то меняется вот так вот:
Hibernate: select limit ? ? poems0_.Id_poem as Id1_1_, poems0_.PoemTitle as PoemTitle1_, poems0_.PoemText as PoemText1_, poems0_.Author as Author1_, poems0_.WhoAdded as WhoAdded1_, poems0_.AdditionDate as Addition6_1_, poems0_.RedactDate as RedactDate1_ from Poems poems0_
Может у вас в конфигурации Hibernate стоит диалект "MSSQL" или старая версия Hibernate.
покажи конфигурацию хибера
У меня были след. строки:
Код:
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
…
</props>
</property>
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
…
</props>
</property>
А должно было быть:
Код:
<property name="hibernateProperties">
<props>
<prop key="hibernate.connection.dialect">
org.hibernate.dialect.HSQLDialect
</prop>
<prop key="hibernate.show_sql">true</prop>
…
</props>
</property>
<props>
<prop key="hibernate.connection.dialect">
org.hibernate.dialect.HSQLDialect
</prop>
<prop key="hibernate.show_sql">true</prop>
…
</props>
</property>
Если б не вы я б ещё долго ломала голову!