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