Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [eclipselink-users] Dynamically get a Count for any CriteriaQuery - is it possible?

This should work in EclipseLink.

The issue seems to be your where clause is a Expression not a Predicate, so
the isTrue() operation is used.  Which does not seem to be working in
Oracle.  Please log a bug for this and vote for it, the issue is that
isTrue/isFalse do not seem to work, or that getRestriction() uses isTrue to
convert an Expression to a Predicate.

A workaround should be to set your where clause to a predicate to avoid the
isTrue.

i.e. instead of 
>> cq.where(cb.like(client.<String>get("lastName"), search.getLastName()));

use,
cq.where(cb.and(cb.conjunction(), cb.like(client.<String>get("lastName"),
search.getLastName())));

or when you get the restrictions get the first expression to pass to the
where.


tch wrote:
> 
> I'd like to start to use the new Criteria API rather than
> EclipseLink's Expression API to make my code more portable. Here's the
> issue that I'm running into however.
> In my current toolbox, I have a dao method that can take any
> ReadAllQuery and get a count query for it. This is great for paging.
> 
> 
> My Expression API based method looks like this:
> 
> public BigDecimal getCountQuery ( Class clazz, Expression eb  ) {
> if( eb == null ) {
> eb = new ExpressionBuilder();
> }
> ReportQuery rq = new ReportQuery(clazz, eb);
> rq.addCount();
> rq.setShouldReturnWithoutReportQueryResult(true);
> Vector reportRows = (Vector) JpaHelper.getEntityManager(
> getEntityManager()).getActiveSession().executeQuery(rq);
>         Integer count = null;
> if (reportRows != null) {
>       return  (BigDecimal) reportRows.get(0);
> }
> return null;
> }
> 
> 
> 
> I took a stab at doing the same thing with a the CriteriaQuery API,
> and just as an example -- this is not generic:
> 
>  CriteriaBuilder cb  = getEntityManager().getCriteriaBuilder();
> 
>               CriteriaQuery<Client> cq = cb.createQuery(Client.class);
> 
> 
>               Root<Client> client = cq.from(Client.class);
> 
>               cq.where(cb.like(client.<String>get("lastName"),
> search.getLastName()));
> 
>               List<Client> clients =
> getEntityManager().createQuery(cq).getResultList();
> 
>               CriteriaQuery<Long> countQuery = cb.createQuery(Long.class);
>               countQuery.select(cb.count(client));
>               countQuery.where(cq.getRestriction());
> 
>               Long count =
> getEntityManager().createQuery(countQuery).getSingleResult();
> 
> 
> The first query looks great, the second query ends up like:
> 
> SELECT COUNT(ID) FROM CLIENT WHERE ((LAST_NAME LIKE ?) = ?)
> and gets bound with '%whatever%', true
> 
> which is not a valid oracle query.
> 
> 
> What I require is a way to easily get a count for any CriteriaQuery.
> This is essential if you're trying to build a mature web application
> in the real world.
> 
> I saw some people in hibernate's jira asking for this, and they cite a
> rule in the jpa 2.0 spec saying you can't copy predicates from one
> CriteriaQuery to another.
> 
> Is there really no way to do that in the current API? If so is there
> some other way I can get the backing EL expression from a
> CriteriaQuery so I can use my old count query, that'd be better than
> nothing.
> 
> Thanks!
> 
> ./tch
> 
> 


-----
http://wiki.eclipse.org/User:James.sutherland.oracle.com James Sutherland 
http://www.eclipse.org/eclipselink/
 EclipseLink ,  http://www.oracle.com/technology/products/ias/toplink/
TopLink 
Wiki:  http://wiki.eclipse.org/EclipseLink EclipseLink , 
http://wiki.oracle.com/page/TopLink TopLink 
Forums:  http://forums.oracle.com/forums/forum.jspa?forumID=48 TopLink , 
http://www.nabble.com/EclipseLink-f26430.html EclipseLink 
Book:  http://en.wikibooks.org/wiki/Java_Persistence Java Persistence 
-- 
View this message in context: http://old.nabble.com/Dynamically-get-a-Count-for-any-CriteriaQuery---is-it-possible--tp28784258p28818197.html
Sent from the EclipseLink - Users mailing list archive at Nabble.com.



Back to the top