[hibernate-commits] Hibernate SVN: r19467 - in core/trunk/entitymanager/src: main/java/org/hibernate/ejb/criteria/expression and 1 other directories.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Tue May 11 11:08:55 EDT 2010


Author: steve.ebersole at jboss.com
Date: 2010-05-11 11:08:54 -0400 (Tue, 11 May 2010)
New Revision: 19467

Modified:
   core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/CriteriaQueryCompiler.java
   core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/expression/LiteralExpression.java
   core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/expression/ParameterExpressionImpl.java
   core/trunk/entitymanager/src/test/java/org/hibernate/ejb/criteria/basic/ExpressionsTest.java
Log:
HHH-4966 - Entity Manager bug with ParameterExpressionImpl


Modified: core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/CriteriaQueryCompiler.java
===================================================================
--- core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/CriteriaQueryCompiler.java	2010-05-11 15:08:10 UTC (rev 19466)
+++ core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/CriteriaQueryCompiler.java	2010-05-11 15:08:54 UTC (rev 19467)
@@ -100,26 +100,23 @@
 		public String generateAlias();
 
 		/**
-		 * Generate a name for a parameter into the JPAQL query.
-		 *
-		 * @return The generated para name
-		 */
-		public String generateParameterName();
-
-		/**
 		 * Register parameters explicitly encountered in the criteria query.
 		 *
 		 * @param criteriaQueryParameter The parameter expression
-		 * @param jpaqlParameterName The generated name for the parameter
+		 *
+		 * @return The JPA-QL parameter name
 		 */
-		public void registerExplicitParameter(ParameterExpression<?> criteriaQueryParameter, String jpaqlParameterName);
+		public String registerExplicitParameter(ParameterExpression<?> criteriaQueryParameter);
 
 		/**
 		 * Register a parameter that was not part of the criteria query (at least not as a parameter).
 		 *
-		 * @param binding The parameter description.
+		 * @param literal The literal value
+		 * @param javaType The java type as whcih to handle the literal value.
+		 *
+		 * @return The JPA-QL parameter name
 		 */
-		public void registerImplicitParameterBinding(ImplicitParameterBinding binding);
+		public String registerLiteralParameterBinding(Object literal, Class javaType);
 
 		/**
 		 * Given a java type, determine the proper cast type name.
@@ -164,22 +161,43 @@
 				return "param" + explicitParameterCount++;
 			}
 
-			public void registerExplicitParameter(ParameterExpression<?> criteriaQueryParameter, String jpaqlParameterName) {
-				explicitParameterMapping.put( criteriaQueryParameter, jpaqlParameterName );
+			public String registerExplicitParameter(ParameterExpression<?> criteriaQueryParameter) {
+				final String jpaqlParameterName;
+				if ( explicitParameterMapping.containsKey( criteriaQueryParameter ) ) {
+					jpaqlParameterName = explicitParameterMapping.get( criteriaQueryParameter );
+				}
+				else {
+					jpaqlParameterName = generateParameterName();
+					explicitParameterMapping.put( criteriaQueryParameter, jpaqlParameterName );
+				}
 				if ( StringHelper.isNotEmpty( criteriaQueryParameter.getName() ) ) {
 					explicitParameterNameMapping.put(
 							criteriaQueryParameter.getName(),
 							criteriaQueryParameter
 					);
 				}
+				return jpaqlParameterName;
 			}
 
-			public void registerImplicitParameterBinding(ImplicitParameterBinding binding) {
+			public String registerLiteralParameterBinding(final Object literal, final Class javaType) {
+				final String parameterName = generateParameterName();
+				final ImplicitParameterBinding binding = new CriteriaQueryCompiler.ImplicitParameterBinding() {
+					public String getParameterName() {
+						return parameterName;
+					}
+
+					public Class getJavaType() {
+						return javaType;
+					}
+
+					public void bind(TypedQuery typedQuery) {
+						typedQuery.setParameter( parameterName, literal );
+					}
+				};
+
 				implicitParameterBindings.add( binding );
-				implicitParameterTypes.put(
-						binding.getParameterName(),
-						binding.getJavaType()
-				);
+				implicitParameterTypes.put( parameterName, javaType );
+				return parameterName;
 			}
 
 			public String getCastType(Class javaType) {

Modified: core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/expression/LiteralExpression.java
===================================================================
--- core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/expression/LiteralExpression.java	2010-05-11 15:08:10 UTC (rev 19466)
+++ core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/expression/LiteralExpression.java	2010-05-11 15:08:54 UTC (rev 19467)
@@ -69,22 +69,7 @@
 		}
 
 		// else...
-		final String parameterName = renderingContext.generateParameterName();
-		renderingContext.registerImplicitParameterBinding(
-				new CriteriaQueryCompiler.ImplicitParameterBinding() {
-					public String getParameterName() {
-						return parameterName;
-					}
-
-					public Class getJavaType() {
-						return LiteralExpression.this.getJavaType();
-					}
-
-					public void bind(TypedQuery typedQuery) {
-						typedQuery.setParameter( parameterName, getLiteral() );
-					}
-				}
-		);
+		final String parameterName = renderingContext.registerLiteralParameterBinding( getLiteral(), getJavaType() );
 		return ':' + parameterName;
 	}
 

Modified: core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/expression/ParameterExpressionImpl.java
===================================================================
--- core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/expression/ParameterExpressionImpl.java	2010-05-11 15:08:10 UTC (rev 19466)
+++ core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/expression/ParameterExpressionImpl.java	2010-05-11 15:08:54 UTC (rev 19467)
@@ -85,8 +85,7 @@
 	}
 
 	public String render(CriteriaQueryCompiler.RenderingContext renderingContext) {
-		final String jpaqlParamName = renderingContext.generateParameterName();
-		renderingContext.registerExplicitParameter( this, jpaqlParamName );
+		final String jpaqlParamName = renderingContext.registerExplicitParameter( this );
 		return ':' + jpaqlParamName;
 	}
 

Modified: core/trunk/entitymanager/src/test/java/org/hibernate/ejb/criteria/basic/ExpressionsTest.java
===================================================================
--- core/trunk/entitymanager/src/test/java/org/hibernate/ejb/criteria/basic/ExpressionsTest.java	2010-05-11 15:08:10 UTC (rev 19466)
+++ core/trunk/entitymanager/src/test/java/org/hibernate/ejb/criteria/basic/ExpressionsTest.java	2010-05-11 15:08:54 UTC (rev 19467)
@@ -27,11 +27,18 @@
 import java.math.BigInteger;
 import java.util.List;
 import javax.persistence.EntityManager;
+import javax.persistence.TypedQuery;
 import javax.persistence.criteria.CriteriaBuilder;
 import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.ParameterExpression;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
 
+import org.hibernate.Query;
 import org.hibernate.ejb.metamodel.AbstractMetamodelSpecificTest;
 import org.hibernate.ejb.metamodel.Product;
+import org.hibernate.ejb.metamodel.Product_;
+import org.hibernate.impl.AbstractQueryImpl;
 
 /**
  * Tests that various expressions operate as expected
@@ -60,16 +67,6 @@
 		em.close();
 	}
 
-	@Override
-	public void tearDown() throws Exception {
-		EntityManager em = getOrCreateEntityManager();
- 		em.getTransaction().begin();
-		em.createQuery( "delete Product" ).executeUpdate();
-		em.getTransaction().commit();
-		em.close();
-		super.tearDown();
-	}
-
 	public void testEmptyConjunction() {
 		EntityManager em = getOrCreateEntityManager();
 		em.getTransaction().begin();
@@ -227,4 +224,28 @@
 		em.close();
 	}
 
+
+	public void testParameterReuse() {
+		EntityManager em = getOrCreateEntityManager();
+		em.getTransaction().begin();
+		CriteriaQuery<Product> criteria = em.getCriteriaBuilder().createQuery( Product.class );
+		Root<Product> from = criteria.from( Product.class );
+		ParameterExpression<String> param = em.getCriteriaBuilder().parameter( String.class );
+		Predicate predicate = em.getCriteriaBuilder().equal( from.get( Product_.id ), param );
+		Predicate predicate2 = em.getCriteriaBuilder().equal( from.get( Product_.name ), param );
+		criteria.where( em.getCriteriaBuilder().or( predicate, predicate2 ) );
+		assertEquals( 1, criteria.getParameters().size() );
+		TypedQuery<Product> query = em.createQuery( criteria );
+		int hqlParamCount = countGeneratedParameters( query.unwrap( Query.class ) );
+		assertEquals( 1, hqlParamCount );
+		query.setParameter( param, "abc" ).getResultList();
+		em.getTransaction().commit();
+		em.close();
+	}
+
+	private int countGeneratedParameters(Query query) {
+		AbstractQueryImpl hqlQueryImpl = (AbstractQueryImpl) query;
+		return hqlQueryImpl.getParameterMetadata().getNamedParameterNames().size();
+	}
+
 }



More information about the hibernate-commits mailing list