[hibernate-issues] [Hibernate-JIRA] Created: (HHH-6902) Create typed query in EntityManager throws NullPointerException when filters are present
Dan Luca (JIRA)
noreply at atlassian.com
Fri Dec 16 09:15:21 EST 2011
Create typed query in EntityManager throws NullPointerException when filters are present
----------------------------------------------------------------------------------------
Key: HHH-6902
URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-6902
Project: Hibernate Core
Issue Type: Bug
Components: core
Affects Versions: 4.0.0.Final
Environment: Oracle 11g; HibernateCore 4.0.0.Final; Spring 3.1.0
Reporter: Dan Luca
I have an environment with JPA annotated entities, some with filters - e.g. filter out logically deleted entities. I have upgraded to hibernate 4 and discovered that {{javax.persistence.EntityManager.createQuery(String, Class<T>)}} throws a {color: red}NullPointerException{color} every time is invoked.
I did some digging and here is what I have found:
* calling {{entityManager.createQuery("query", resultType)}} on the current entity manager, ends up at {{org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(String, Class<T>)}}
* this method does two things:
*# creates the actual HQL query
*# performs validation of the result type
* step 2 above has the following call
{code:title=AbstractEntityManagerImpl}
final HQLQueryPlan queryPlan = unwrap( SessionImplementor.class )
.getFactory()
.getQueryPlanCache()
.getHQLQueryPlan( jpaqlString, false, null );
{code}
Note the third argument in the {{QueryPlanCache.getHQLQueryPlan(String, boolean, Map)}} call is null. This argument is a raw +Map+ of enabled filters.
* {{org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(String, boolean, Map)}} implementation creates a cache key from {color:navy}(queryString, shallowFlag, enabledFilters){color} tuple and if a plan exists it uses it, otherwise creates a brand new plan by invoking its constructor: {{new HQLQueryPlan(queryString, shallow, enabledFilters, factory )}}
** Note that the key created by step 1 above when there are filters defined, is +different+ from the one created with {{enabledFilters}} set to empty or null
* the HQLQueryPlan constructor invokes *{color:red}{{enabledFilters.keySet()}}{color}* - hence the NPE
I believe the correct invocation of the {{getHQLQueryPlan()}} at step 2 - for the purposes of validation - should be something like this instead:
{{.getHQLQueryPlan( jpaqlString, false, *Collections.emptyMap())*}}
--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira
More information about the hibernate-issues
mailing list