[hibernate-issues] [Hibernate-JIRA] Created: (HHH-7175) Possible problem with org.hibernate.engine.query.HQLQueryPlan
Imrich Olha (JIRA)
noreply at atlassian.com
Thu Mar 15 06:56:48 EDT 2012
Possible problem with org.hibernate.engine.query.HQLQueryPlan
-------------------------------------------------------------
Key: HHH-7175
URL: https://hibernate.onjira.com/browse/HHH-7175
Project: Hibernate ORM
Issue Type: Bug
Components: core
Environment: hibernate-core-3.3.2.GA.jar, Oracle DB, Java(TM) SE Runtime Environment (build 1.6.0_31-b04)
Reporter: Imrich Olha
Priority: Minor
I wrote a simple 'polymorphic' queryString for org.hibernate.Query based on interface implemented by three other classes.
I set restriction on size (maxRows) too.
But when I executed that query, I found that some records where missing in returned list.
I debugged sources and found possible issue in org.hibernate.engine.query.HQLQueryPlan in method
public List performList(QueryParameters queryParameters, SessionImplementor session) throws HibernateException { ... }
specifically in branch for restricted (needsLimit) polymorphic query executing:
**************************************************************************************
int includedCount = -1;
translator_loop: for ( int i = 0; i < translators.length; i++ ) {
List tmp = translators[i].list( session, queryParametersToUse );
if ( needsLimit ) {
// NOTE : firstRow is zero-based
int first = queryParameters.getRowSelection().getFirstRow() == null
? 0
: queryParameters.getRowSelection().getFirstRow().intValue();
int max = queryParameters.getRowSelection().getMaxRows() == null
? -1
: queryParameters.getRowSelection().getMaxRows().intValue();
final int size = tmp.size();
for ( int x = 0; x < size; x++ ) {
final Object result = tmp.get( x );
if ( ! distinction.add( result ) ) {
continue;
}
includedCount++;
if ( includedCount < first ) {
continue;
}
combinedResults.add( result );
if ( max >= 0 && includedCount > max ) {
// break the outer loop !!!
break translator_loop;
}
}
}
else {
combinedResults.addAll( tmp );
}
}
**************************************************************************************
or when I simplyfy the issue :
int includedCount = -1;
for ( int x = 0; x < size; x++ ) {
final Object result = tmp.get( x );
includedCount++;
combinedResults.add( result );
if ( max >= 0 && includedCount > max ) {
// break the outer loop !!!
break translator_loop;
}
}
for example let start with max = 1;
before for we start with includedCount = -1; x is undefined; combinedResults is empty;
after 1. iteration: includedCount = 0; x = 0; combinedResults contains 1 item; test 'if ( max >= 0 && includedCount > max )' allows another iteration.
after 2. iteration: includedCount = 1; x = 1; combinedResults contains 2 items; test 'if ( max >= 0 && includedCount > max )' allows another iteration.
after 3. iteration: includedCount = 2; x = 2; combinedResults contains 3 items; test 'if ( max >= 0 && includedCount > max )' BREAKS another iteration.
so we will finished with 3 items in combinedResults list, but requires only max = 1;
**************************************************************************************
And this is (I suppose) my problem of missing records (in next iteration in our PagedDataSource) :)
It is correct ?
Imrich Olha
Ps. Sorry my bad english :(
--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira
More information about the hibernate-issues
mailing list