[hibernate-issues] [Hibernate-JIRA] Commented: (HHH-4603) Copy Predicate from a CriteriaQuery to another will cause QuerySyntaxException

Steve Ebersole (JIRA) noreply at atlassian.com
Tue Nov 24 13:25:08 EST 2009


    [ http://opensource.atlassian.com/projects/hibernate/browse/HHH-4603?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=34753#action_34753 ] 

Steve Ebersole commented on HHH-4603:
-------------------------------------

To be clear...

One thing we could try is to give a better up-front error messages, but that would mean tracking the CriteriaQuery instance in each and every Predicate and checking that when attaching to a CriteriaQuery.  Doable, but very low priority atm.

> Copy Predicate from a CriteriaQuery to another will cause QuerySyntaxException
> ------------------------------------------------------------------------------
>
>                 Key: HHH-4603
>                 URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-4603
>             Project: Hibernate Core
>          Issue Type: Bug
>          Components: entity-manager
>    Affects Versions: 3.5.0-Beta-2
>            Reporter: zhouyanming
>            Assignee: Steve Ebersole
>
> I build a CriteriaQuery and I want count it before fetch data for pagination,so I need create a new CriteriaQuery for counting.
> public long countByCriteria(CriteriaQuery cq) {
> CriteriaBuilder cb = getCriteriaBuilder();
> CriteriaQuery count = cb.createQuery(Long.class);
> Root<T> root = count.from(cq.getResultType());
> EntityType<T> entityType = metamodel.entity(cq.getResultType());
> Expression idExpression = root.get(entityType.getSingularAttribute("id"));
> count.select(cb.count(idExpression));
> count.where(cq.getRestriction());  //here will cause exception
> TypedQuery<Long> tq = em.createQuery(count);
> return tq.getSingleResult();
> }
> @Test
> public void testCountByCriteria() {
> CriteriaBuilder cb = getCriteriaBuilder();
> CriteriaQuery<User> cq = cb.criteriaQuery(User.class);
> Root<User> root = cq.from(User.class);
> EntityType<User> entityType = getMetamodel().entity(User.class);
> Expression expression = root.get(entityType.getSingularAttribute("username"));
> Predicate condition = cb.equal(expression, "admin");
> cq.where(condition);
> assertTrue(baseManager.countByCriteria(cq) > 0);
> }
> Caused by: java.lang.IllegalArgumentException: org.hibernate.hql.ast.QuerySyntaxException: Invalid path: 'generatedAlias1.username' [select count(generatedAlias0.id) from model.User as generatedAlias0 where generatedAlias1.username=:param0]
> 	at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:855)
> 	at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:138)
> 	at org.hibernate.ejb.criteria.CriteriaQueryCompiler.compile(CriteriaQueryCompiler.java:104)
> 	at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:148)
> 	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> 	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
> 	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
> 	at java.lang.reflect.Method.invoke(Method.java:597)
> 	at org.springframework.orm.jpa.JpaTemplate$CloseSuppressingInvocationHandler.invoke(JpaTemplate.java:404)
> 	... 38 more
> Caused by: org.hibernate.hql.ast.QuerySyntaxException: Invalid path: 'generatedAlias1.username' [select count(generatedAlias0.id) from model.User as generatedAlias0 where generatedAlias1.username=:param0]
> 	at org.hibernate.hql.ast.QuerySyntaxException.convert(QuerySyntaxException.java:54)
> 	at org.hibernate.hql.ast.QuerySyntaxException.convert(QuerySyntaxException.java:47)
> 	at org.hibernate.hql.ast.ErrorCounter.throwQueryException(ErrorCounter.java:82)
> 	at org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:261)
> 	at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:185)
> 	at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:136)
> 	at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:101)
> 	at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:80)
> 	at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:98)
> 	at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:156)
> 	at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:135)
> 	at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1761)
> 	at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:123)
> 	... 48 more

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

        


More information about the hibernate-issues mailing list