[hibernate-issues] [Hibernate-JIRA] Commented: (HHH-2207) Suggested fix for HQL - MySQL setMaxResults issue
Toby Moore (JIRA)
noreply at atlassian.com
Mon Nov 6 10:11:04 EST 2006
[ http://opensource.atlassian.com/projects/hibernate/browse/HHH-2207?page=comments#action_25167 ]
Toby Moore commented on HHH-2207:
---------------------------------
ok
here's a test case
public void testSimpleSelectWithLimit() throws Exception
{
createTestBaseData();
Session session = openSession();
Query query = session.createQuery( "select a from Animal as a" );
query.setFirstResult(2);
query.setMaxResults(1);
List results = query.list();
session.close();
destroyTestBaseData();
}
for ASTParserLoadingTest.
if you use this with a mysql database, you should see a reproduction of the problem.
> Suggested fix for HQL - MySQL setMaxResults issue
> -------------------------------------------------
>
> Key: HHH-2207
> URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-2207
> Project: Hibernate3
> Type: Bug
> Components: query-hql
> Versions: 3.2.0.ga
> Environment: Hi 3.2.0.ga MySQL
> Reporter: Toby Moore
> Attachments: querloaderdiff.patch
>
> Original Estimate: 0 minutes
> Remaining: 0 minutes
>
> Hi,
> After some experimentation, we'd like to suggest an easy fix to a problem we encountered.
> When using HQL with the Hibernate 3 entity manager to limit the number of records returned ( at the database level, via generated SQL, not in memory) we were getting an exception due to the query builder trying to attach a parameter to the prepared statement that was out of bounds :
> by: java.sql.SQLException: Parameter index out of range (4 > number of parameters, which is 3).
> at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:910)
> at com.mysql.jdbc.PreparedStatement.setInternal(PreparedStatement.java:2556)
> at com.mysql.jdbc.PreparedStatement.setInternal(PreparedStatement.java:2584)
> at com.mysql.jdbc.PreparedStatement.setInt(PreparedStatement.java:2540)
> at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.setInt(NewProxyPreparedStatement.java:677)
> at org.hibernate.loader.Loader.bindLimitParameters(Loader.java:1616)
> at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1560)
> at org.hibernate.loader.Loader.doQuery(Loader.java:661)
> at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
> at org.hibernate.loader.Loader.doList(Loader.java:2156)
> ... 10 more
> On looking at the code in the method bindParameterValues in org.hibernate.loader.hql.QueryLoader ( line 491 ) the method returns the next parameter position that needs to be set, not the amount of parameters it has added, which is expected in Loader.java on the line
> col += bindParameterValues( st, queryParameters, col, session );
> This causes the parameter count to get out of sync and thus throw the expcetion saying that it can't add a parameter out of range.
> A simple fix for this is to change the return line in QueryLoader to be
> return position - startPosition;
> which will return the amount of parameters this method added.
> We've tested this on our mysql implementation and it works, and run the unit tests to check that no extra errors are generated. If this seems like a good fix then i'll submit it as a patch via the JIRA, but would like to hear any thoughts first?
> Kind regards,
> TobyM - MindCandyDesign London
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://opensource.atlassian.com/projects/hibernate/secure/Administrators.jspa
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira
More information about the hibernate-issues
mailing list