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

Pete Muir (JIRA) jira-events at lists.jboss.org
Sun Dec 23 12:43:43 EST 2007


     [ http://jira.jboss.com/jira/browse/JBSEAM-2381?page=all ]

Pete Muir updated JBSEAM-2381:
------------------------------

    Fix Version/s: 2.0.2.GA

This seems sensible to me, but we should be careful that this doesn't have unintentional side effects.

> 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
>             Fix For: 2.0.2.GA
>
>
> 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