[hibernate-commits] Hibernate SVN: r19233 - in core/trunk/entitymanager/src: main/java/org/hibernate/ejb/criteria and 1 other directories.
hibernate-commits at lists.jboss.org
hibernate-commits at lists.jboss.org
Wed Apr 14 14:08:37 EDT 2010
Author: steve.ebersole at jboss.com
Date: 2010-04-14 14:08:37 -0400 (Wed, 14 Apr 2010)
New Revision: 19233
Modified:
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/QueryImpl.java
core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/CriteriaQueryCompiler.java
core/trunk/entitymanager/src/test/java/org/hibernate/ejb/criteria/QueryBuilderTest.java
Log:
HHH-4965 - Implicit parameters abusively use TypeFactory.heuristicType losing UserType and XToOneType info
Modified: core/trunk/entitymanager/src/main/java/org/hibernate/ejb/QueryImpl.java
===================================================================
--- core/trunk/entitymanager/src/main/java/org/hibernate/ejb/QueryImpl.java 2010-04-14 16:27:11 UTC (rev 19232)
+++ core/trunk/entitymanager/src/main/java/org/hibernate/ejb/QueryImpl.java 2010-04-14 18:08:37 UTC (rev 19233)
@@ -102,7 +102,7 @@
final NamedParameterDescriptor descriptor =
queryImpl.getParameterMetadata().getNamedParameterDescriptor( name );
Class javaType = namedParameterTypeRedefinition.get( name );
- if ( javaType != null ) {
+ if ( javaType != null && mightNeedRedefinition( javaType ) ) {
descriptor.resetExpectedType(
TypeFactory.heuristicType( javaType.getName() )
);
@@ -140,6 +140,11 @@
this.parameters = java.util.Collections.unmodifiableSet( parameters );
}
+ private boolean mightNeedRedefinition(Class javaType) {
+ // for now, only really no for dates/times/timestamps
+ return java.util.Date.class.isAssignableFrom( javaType );
+ }
+
private static class ParameterImpl implements Parameter {
private final String name;
private final Integer position;
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-04-14 16:27:11 UTC (rev 19232)
+++ core/trunk/entitymanager/src/main/java/org/hibernate/ejb/criteria/CriteriaQueryCompiler.java 2010-04-14 18:08:37 UTC (rev 19233)
@@ -60,19 +60,74 @@
public class CriteriaQueryCompiler implements Serializable {
private static final Logger log = LoggerFactory.getLogger( CriteriaQueryCompiler.class );
+ /**
+ * Used to describe implicit (not defined in criteria query) parameters.
+ */
public static interface ImplicitParameterBinding {
+ /**
+ * Retrieve the generated name of the implicit parameter.
+ *
+ * @return The parameter name.
+ */
public String getParameterName();
+
+ /**
+ * Get the java type of the "thing" that led to the implicit parameter. Used from
+ * {@link org.hibernate.ejb.HibernateEntityManagerImplementor.Options#getNamedParameterExplicitTypes()}
+ * in determining "guessed type" overriding.
+ *
+ * @return The java type
+ */
public Class getJavaType();
+
+ /**
+ * Bind the implicit parameter's value to the JPA query.
+ *
+ * @param typedQuery The JPA query.
+ */
public void bind(TypedQuery typedQuery);
}
+ /**
+ * Used to provide a context and services to the rendering.
+ */
public static interface RenderingContext {
+ /**
+ * Generate a correlation name.
+ *
+ * @return The generated correlation name
+ */
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
+ */
public void registerExplicitParameter(ParameterExpression<?> criteriaQueryParameter, String jpaqlParameterName);
+
+ /**
+ * Register a parameter that was not part of the criteria query (at least not as a parameter).
+ *
+ * @param binding The parameter description.
+ */
public void registerImplicitParameterBinding(ImplicitParameterBinding binding);
+ /**
+ * Given a java type, determine the proper cast type name.
+ *
+ * @param javaType The java type.
+ *
+ * @return The cast type name.
+ */
public String getCastType(Class javaType);
}
Modified: core/trunk/entitymanager/src/test/java/org/hibernate/ejb/criteria/QueryBuilderTest.java
===================================================================
--- core/trunk/entitymanager/src/test/java/org/hibernate/ejb/criteria/QueryBuilderTest.java 2010-04-14 16:27:11 UTC (rev 19232)
+++ core/trunk/entitymanager/src/test/java/org/hibernate/ejb/criteria/QueryBuilderTest.java 2010-04-14 18:08:37 UTC (rev 19233)
@@ -23,7 +23,9 @@
*/
package org.hibernate.ejb.criteria;
+import java.util.ArrayList;
import java.util.Collection;
+import java.util.List;
import java.util.Set;
import javax.persistence.EntityManager;
import javax.persistence.TypedQuery;
@@ -112,6 +114,47 @@
em.close();
}
+ public void testEqualityComparisonEntityConversion() {
+ EntityManager em = getOrCreateEntityManager();
+ em.getTransaction().begin();
+ Address address = new Address( "Street Id", "Fake Street", "Fake City", "Fake State", "Fake Zip" );
+ Phone phone1 = new Phone( "1", "555", "0001", address );
+ Phone phone2 = new Phone( "2", "555", "0002", address );
+ Phone phone3 = new Phone( "3", "555", "0003", address );
+ Phone phone4 = new Phone( "4", "555", "0004" );
+
+ Collection<Phone> phones = new ArrayList<Phone>( 3 );
+ phones.add( phone1 );
+ phones.add( phone2 );
+ phones.add( phone3 );
+
+ address.setPhones( phones );
+ em.persist( address );
+ em.persist( phone4 );
+
+ em.getTransaction().commit();
+
+
+ em.getTransaction().begin();
+
+ CriteriaBuilderImpl cb = (CriteriaBuilderImpl) em.getCriteriaBuilder();
+ MetamodelImpl mm = (MetamodelImpl) em.getMetamodel();
+ EntityType<Phone> Phone_ = mm.entity( Phone.class );
+
+ CriteriaQuery<Phone> cquery = cb.createQuery( Phone.class );
+ Root<Phone> phone = cquery.from( Phone.class );
+ ComparisonPredicate predicate = (ComparisonPredicate) cb.equal(
+ phone.get( Phone_.getSingularAttribute( "address", Address.class ) ),
+ address
+ );
+ cquery.where( predicate );
+ List<Phone> results = em.createQuery( cquery ).getResultList();
+
+ assertEquals( 3, results.size() );
+ em.getTransaction().commit();
+ em.close();
+ }
+
public void testTypeConversion() {
EntityManager em = getOrCreateEntityManager();
em.getTransaction().begin();
More information about the hibernate-commits
mailing list