[jbossseam-issues] [JBoss JIRA] Created: (JBSEAM-2381) EntityQuery to stop fetching maxResults + 1 rows

Brian Kalbfus (JIRA) jira-events at lists.jboss.org
Thu Dec 13 23:51:51 EST 2007


EntityQuery to stop fetching maxResults + 1 rows
------------------------------------------------

                 Key: JBSEAM-2381
                 URL: http://jira.jboss.com/jira/browse/JBSEAM-2381
             Project: JBoss Seam
          Issue Type: Feature Request
          Components: EJB3
    Affects Versions: 2.0.1.CR1, 2.0.0.GA
            Reporter: Brian Kalbfus


In using a hibernate interceptor to audit instantiating entities, I noticed one extra record in excess of getMaxResults() is instantiated that isn't used - thus rendering a false audit.  This was because of the following code in EntityQuery (copied from CVS head):

<code>

protected javax.persistence.Query createQuery()
   {
      parseEjbql();
      
      evaluateAllParameters();
      
      joinTransaction();
      
      javax.persistence.Query query = getEntityManager().createQuery( getRenderedEjbql() );
      setParameters( query, getQueryParameterValues(), 0 );
      setParameters( query, getRestrictionParameterValues(), getQueryParameterValues().size() );
      if ( getFirstResult()!=null) query.setFirstResult( getFirstResult() );
      if ( getMaxResults()!=null) query.setMaxResults( getMaxResults()+1 ); //add one, so we can tell if there is another page
      if ( getHints()!=null )
      {
         for ( Map.Entry<String, String> me: getHints().entrySet() )
         {
            query.setHint(me.getKey(), me.getValue());
         }
      }
      return query;
   }

</code>

Specifically:
      if ( getMaxResults()!=null) query.setMaxResults( getMaxResults()+1 ); //add one, so we can tell if there is another page

The code says it is adding one so that it knows if there is another page.  I see its use here:

<code>
public boolean isNextExists()
   {
      return resultList!=null && 
            resultList.size() > getMaxResults();
   }
</code>

I propose this for isNextExists():

<code>
public boolean isNextExists()
   {
      return getResultCount() > (getFirstResult()!=null?getFirstResult():0) + getMaxResults();
   }
</code>

Then we can change that line in createQuery() to:
      if ( getMaxResults()!=null) query.setMaxResults( getMaxResults() );


I did this in my subclass by overriding these two methods for my project; I had to copy in some of the private members of EntityQuery to do this.

Thanks,
Brian Kalbfus

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://jira.jboss.com/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        



More information about the seam-issues mailing list