From ea5cf961e169202306b84e32f6c9a0888c3d3001 Mon Sep 17 00:00:00 2001 From: Steve Ebersole Date: Fri, 30 Dec 2011 22:12:23 -0600 Subject: [PATCH] HHH-6902 - Create typed query in EntityManager throws NullPointerException when filters are present --- .../ejb/AbstractEntityManagerImpl.java | 10 ++- .../ejb/test/hibernateFilters/Account.java | 74 +++++++++++++++++++ .../EntityManagerWithFilteredSessionTest.java | 51 +++++++++++++ 3 files changed, 131 insertions(+), 4 deletions(-) create mode 100644 hibernate-entitymanager/src/test/java/org/hibernate/ejb/test/hibernateFilters/Account.java create mode 100644 hibernate-entitymanager/src/test/java/org/hibernate/ejb/test/hibernateFilters/EntityManagerWithFilteredSessionTest.java diff --git a/hibernate-entitymanager/src/main/java/org/hibernate/ejb/AbstractEntityManagerImpl.java b/hibernate-entitymanager/src/main/java/org/hibernate/ejb/AbstractEntityManagerImpl.java index 86f55a238a..db1ca79569 100755 --- a/hibernate-entitymanager/src/main/java/org/hibernate/ejb/AbstractEntityManagerImpl.java +++ b/hibernate-entitymanager/src/main/java/org/hibernate/ejb/AbstractEntityManagerImpl.java @@ -303,10 +303,12 @@ else if ( Tuple.class.equals( resultClass ) ) { hqlQuery.setResultTransformer( tupleTransformer ); } else { - final HQLQueryPlan queryPlan = unwrap( SessionImplementor.class ) - .getFactory() - .getQueryPlanCache() - .getHQLQueryPlan( jpaqlString, false, null ); + final SessionImplementor session = unwrap( SessionImplementor.class ); + final HQLQueryPlan queryPlan = session.getFactory().getQueryPlanCache().getHQLQueryPlan( + jpaqlString, + false, + session.getLoadQueryInfluencers().getEnabledFilters() + ); final Class dynamicInstantiationClass = queryPlan.getDynamicInstantiationResultType(); if ( dynamicInstantiationClass != null ) { if ( ! resultClass.isAssignableFrom( dynamicInstantiationClass ) ) { diff --git a/hibernate-entitymanager/src/test/java/org/hibernate/ejb/test/hibernateFilters/Account.java b/hibernate-entitymanager/src/test/java/org/hibernate/ejb/test/hibernateFilters/Account.java new file mode 100644 index 0000000000..f66cec8229 --- /dev/null +++ b/hibernate-entitymanager/src/test/java/org/hibernate/ejb/test/hibernateFilters/Account.java @@ -0,0 +1,74 @@ +/* + * Hibernate, Relational Persistence for Idiomatic Java + * + * Copyright (c) 2011, Red Hat Inc. or third-party contributors as + * indicated by the @author tags or express copyright attribution + * statements applied by the authors. All third-party contributions are + * distributed under license by Red Hat Inc. + * + * This copyrighted material is made available to anyone wishing to use, modify, + * copy, or redistribute it subject to the terms and conditions of the GNU + * Lesser General Public License, as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this distribution; if not, write to: + * Free Software Foundation, Inc. + * 51 Franklin Street, Fifth Floor + * Boston, MA 02110-1301 USA + */ +package org.hibernate.ejb.test.hibernateFilters; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; + +import org.hibernate.annotations.Filter; +import org.hibernate.annotations.FilterDef; +import org.hibernate.annotations.GenericGenerator; +import org.hibernate.annotations.ParamDef; + +/** + * @author Steve Ebersole + */ +@Entity +@FilterDef( name="byRegion", parameters = {@ParamDef(name = "region", type = "string")}) +@Filter( name = "byRegion", condition = "region_cd = :region" ) +public class Account { + private Long id; + private String name; + private String regionCode; + + @Id + @GeneratedValue( generator = "increment" ) + @GenericGenerator( name = "increment", strategy = "increment" ) + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Column( name = "region_cd" ) + public String getRegionCode() { + return regionCode; + } + + public void setRegionCode(String regionCode) { + this.regionCode = regionCode; + } +} diff --git a/hibernate-entitymanager/src/test/java/org/hibernate/ejb/test/hibernateFilters/EntityManagerWithFilteredSessionTest.java b/hibernate-entitymanager/src/test/java/org/hibernate/ejb/test/hibernateFilters/EntityManagerWithFilteredSessionTest.java new file mode 100644 index 0000000000..7763a9cb40 --- /dev/null +++ b/hibernate-entitymanager/src/test/java/org/hibernate/ejb/test/hibernateFilters/EntityManagerWithFilteredSessionTest.java @@ -0,0 +1,51 @@ +/* + * Hibernate, Relational Persistence for Idiomatic Java + * + * Copyright (c) 2011, Red Hat Inc. or third-party contributors as + * indicated by the @author tags or express copyright attribution + * statements applied by the authors. All third-party contributions are + * distributed under license by Red Hat Inc. + * + * This copyrighted material is made available to anyone wishing to use, modify, + * copy, or redistribute it subject to the terms and conditions of the GNU + * Lesser General Public License, as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this distribution; if not, write to: + * Free Software Foundation, Inc. + * 51 Franklin Street, Fifth Floor + * Boston, MA 02110-1301 USA + */ +package org.hibernate.ejb.test.hibernateFilters; + +import javax.persistence.EntityManager; + +import org.hibernate.Session; +import org.hibernate.ejb.test.BaseEntityManagerFunctionalTestCase; + +import org.junit.Test; + +/** + * @author Steve Ebersole + */ +public class EntityManagerWithFilteredSessionTest extends BaseEntityManagerFunctionalTestCase { + @Override + public Class[] getAnnotatedClasses() { + return new Class[] { Account.class }; + } + + @Test + public void testTypedQueryCreation() { + EntityManager em = getOrCreateEntityManager(); + em.getTransaction().begin(); + em.unwrap( Session.class ).enableFilter( "byRegion" ).setParameter( "region", "US" ); + em.createQuery( "from Account", Account.class ).getResultList(); + em.getTransaction().commit(); + em.close(); + } +}