[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