[hibernate-commits] Hibernate SVN: r19136 - in core/trunk: testsuite/src/test/java/org/hibernate/test/hql and 1 other directories.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Mon Mar 29 21:05:19 EDT 2010


Author: gbadner
Date: 2010-03-29 21:05:18 -0400 (Mon, 29 Mar 2010)
New Revision: 19136

Modified:
   core/trunk/core/src/main/java/org/hibernate/hql/ast/tree/BinaryLogicOperatorNode.java
   core/trunk/testsuite/src/test/java/org/hibernate/test/hql/ASTParserLoadingTest.java
   core/trunk/testsuite/src/test/java/org/hibernate/test/orphan/one2one/pk/unidirectional/DeleteOneToOneOrphansTest.java
Log:
HHH-2088 : TypeMismatchException on object equality expression from one-to-one relationship

Modified: core/trunk/core/src/main/java/org/hibernate/hql/ast/tree/BinaryLogicOperatorNode.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/hql/ast/tree/BinaryLogicOperatorNode.java	2010-03-30 00:56:45 UTC (rev 19135)
+++ core/trunk/core/src/main/java/org/hibernate/hql/ast/tree/BinaryLogicOperatorNode.java	2010-03-30 01:05:18 UTC (rev 19136)
@@ -23,6 +23,7 @@
  */
 package org.hibernate.hql.ast.tree;
 
+import org.hibernate.type.OneToOneType;
 import org.hibernate.type.Type;
 import org.hibernate.Hibernate;
 import org.hibernate.TypeMismatchException;
@@ -80,8 +81,8 @@
 		// resolve an expected type
 		SessionFactoryImplementor sessionFactory = getSessionFactoryHelper().getFactory();
 		if ( lhsType != null && rhsType != null ) {
-			int lhsColumnSpan = lhsType.getColumnSpan( sessionFactory );
-			if ( lhsColumnSpan != rhsType.getColumnSpan( sessionFactory ) ) {
+			int lhsColumnSpan = getColumnSpan( lhsType, sessionFactory );
+			if ( lhsColumnSpan != getColumnSpan( rhsType, sessionFactory ) ) {
 				throw new TypeMismatchException(
 						"left and right hand sides of a binary logic operator were incompatibile [" +
 						lhsType.getName() + " : "+ rhsType.getName() + "]"
@@ -97,6 +98,14 @@
 		}
 	}
 
+	private int getColumnSpan(Type type, SessionFactoryImplementor sfi) {
+		int columnSpan = type.getColumnSpan( sfi );
+		if ( columnSpan == 0 && type instanceof OneToOneType ) {
+			columnSpan = ( ( OneToOneType ) type ).getIdentifierOrUniqueKeyType( sfi ).getColumnSpan( sfi );
+		}
+		return columnSpan;
+	}
+
 	/**
 	 * Mutate the subtree relating to a row-value-constructor to instead use
 	 * a series of ANDed predicates.  This allows multi-column type comparisons

Modified: core/trunk/testsuite/src/test/java/org/hibernate/test/hql/ASTParserLoadingTest.java
===================================================================
--- core/trunk/testsuite/src/test/java/org/hibernate/test/hql/ASTParserLoadingTest.java	2010-03-30 00:56:45 UTC (rev 19135)
+++ core/trunk/testsuite/src/test/java/org/hibernate/test/hql/ASTParserLoadingTest.java	2010-03-30 01:05:18 UTC (rev 19136)
@@ -565,6 +565,32 @@
 		return count;
 	}
 
+	public void testEntityAndOneToOneReturnedByQuery() {
+		Session s = openSession();
+		s.beginTransaction();
+		Human h = new Human();
+		h.setName( new Name( "Gail", null, "Badner" ) );
+		s.save( h );
+		User u = new User();
+		u.setUserName(  "gbadner" );
+		u.setHuman( h );
+		s.save( u );
+		s.getTransaction().commit();
+		s.close();
+
+		s = openSession();
+		s.beginTransaction();
+		Object [] result = ( Object [] ) s.createQuery( "from User u, Human h where u.human = h" ).uniqueResult();
+		assertNotNull( result );
+		assertEquals( u.getUserName(), ( ( User ) result[ 0 ] ).getUserName() );
+		assertEquals( h.getName().getFirst(), ( ( Human ) result[ 1 ] ).getName().getFirst() );
+		assertSame( ( ( User ) result[ 0 ] ).getHuman(), result[ 1 ] );
+		s.createQuery( "delete User" ).executeUpdate();
+		s.createQuery( "delete Human" ).executeUpdate();
+		s.getTransaction().commit();
+		s.close();
+	}
+
 	public void testNestedComponentIsNull() {
 		// (1) From MapTest originally...
 		// (2) Was then moved into HQLTest...

Modified: core/trunk/testsuite/src/test/java/org/hibernate/test/orphan/one2one/pk/unidirectional/DeleteOneToOneOrphansTest.java
===================================================================
--- core/trunk/testsuite/src/test/java/org/hibernate/test/orphan/one2one/pk/unidirectional/DeleteOneToOneOrphansTest.java	2010-03-30 00:56:45 UTC (rev 19135)
+++ core/trunk/testsuite/src/test/java/org/hibernate/test/orphan/one2one/pk/unidirectional/DeleteOneToOneOrphansTest.java	2010-03-30 01:05:18 UTC (rev 19136)
@@ -72,6 +72,12 @@
 		assertEquals( 1, results.size() );
 		Employee emp = ( Employee ) results.get( 0 );
 		assertNotNull( emp.getInfo() );
+		results = session.createQuery( "from Employee e, EmployeeInfo i where e.info = i" ).list();
+		assertEquals( 1, results.size() );
+		Object [] result = ( Object [] ) results.get( 0 );
+		emp = ( Employee ) result[ 0 ];
+		assertNotNull( result[ 1 ] );
+		assertSame( emp.getInfo(), result[ 1 ] );
 		emp.setInfo( null );
 		session.getTransaction().commit();
 		session.close();



More information about the hibernate-commits mailing list