[hibernate-commits] Hibernate SVN: r20282 - in core/trunk: core/src/main/java/org/hibernate/loader/criteria and 1 other directories.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Mon Aug 30 20:18:56 EDT 2010


Author: gbadner
Date: 2010-08-30 20:18:55 -0400 (Mon, 30 Aug 2010)
New Revision: 20282

Modified:
   core/trunk/core/src/main/java/org/hibernate/criterion/BetweenExpression.java
   core/trunk/core/src/main/java/org/hibernate/criterion/CriteriaQuery.java
   core/trunk/core/src/main/java/org/hibernate/criterion/IlikeExpression.java
   core/trunk/core/src/main/java/org/hibernate/criterion/InExpression.java
   core/trunk/core/src/main/java/org/hibernate/criterion/LikeExpression.java
   core/trunk/core/src/main/java/org/hibernate/criterion/NotNullExpression.java
   core/trunk/core/src/main/java/org/hibernate/criterion/NullExpression.java
   core/trunk/core/src/main/java/org/hibernate/criterion/PropertyExpression.java
   core/trunk/core/src/main/java/org/hibernate/criterion/SimpleExpression.java
   core/trunk/core/src/main/java/org/hibernate/loader/criteria/CriteriaQueryTranslator.java
   core/trunk/testsuite/src/test/java/org/hibernate/test/criteria/CriteriaQueryTest.java
Log:
HHH-817 : Projection aliases should not be applied to where-clause (Milosz Tylenda)

Modified: core/trunk/core/src/main/java/org/hibernate/criterion/BetweenExpression.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/criterion/BetweenExpression.java	2010-08-30 03:21:12 UTC (rev 20281)
+++ core/trunk/core/src/main/java/org/hibernate/criterion/BetweenExpression.java	2010-08-31 00:18:55 UTC (rev 20282)
@@ -50,7 +50,7 @@
 	throws HibernateException {
 		return StringHelper.join(
 			" and ",
-			StringHelper.suffix( criteriaQuery.getColumnsUsingProjection(criteria, propertyName), " between ? and ?" )
+			StringHelper.suffix( criteriaQuery.findColumns(propertyName, criteria), " between ? and ?" )
 		);
 
 		//TODO: get SQL rendering out of this package!

Modified: core/trunk/core/src/main/java/org/hibernate/criterion/CriteriaQuery.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/criterion/CriteriaQuery.java	2010-08-30 03:21:12 UTC (rev 20281)
+++ core/trunk/core/src/main/java/org/hibernate/criterion/CriteriaQuery.java	2010-08-31 00:18:55 UTC (rev 20282)
@@ -57,6 +57,14 @@
 	throws HibernateException;
 
 	/**
+	 * Get the names of the columns mapped by a property path; if the
+	 * property path is not found in criteria, try the "outer" query.
+	 * Projection aliases are ignored.
+	 */
+	public String[] findColumns(String propertyPath, Criteria criteria)
+	throws HibernateException;
+
+	/**
 	 * Get the type of a property path, ignoring projection aliases
 	 */
 	public Type getType(Criteria criteria, String propertyPath)
@@ -67,7 +75,7 @@
 	 */
 	public String[] getColumnsUsingProjection(Criteria criteria, String propertyPath) 
 	throws HibernateException;
-	
+
 	/**
 	 * Get the type of a property path
 	 */

Modified: core/trunk/core/src/main/java/org/hibernate/criterion/IlikeExpression.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/criterion/IlikeExpression.java	2010-08-30 03:21:12 UTC (rev 20281)
+++ core/trunk/core/src/main/java/org/hibernate/criterion/IlikeExpression.java	2010-08-31 00:18:55 UTC (rev 20282)
@@ -52,7 +52,7 @@
 	public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery)
 	throws HibernateException {
 		Dialect dialect = criteriaQuery.getFactory().getDialect();
-		String[] columns = criteriaQuery.getColumnsUsingProjection(criteria, propertyName);
+		String[] columns = criteriaQuery.findColumns(propertyName, criteria);
 		if (columns.length!=1) throw new HibernateException("ilike may only be used with single-column properties");
 		if ( dialect instanceof PostgreSQLDialect ) {
 			return columns[0] + " ilike ?";

Modified: core/trunk/core/src/main/java/org/hibernate/criterion/InExpression.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/criterion/InExpression.java	2010-08-30 03:21:12 UTC (rev 20281)
+++ core/trunk/core/src/main/java/org/hibernate/criterion/InExpression.java	2010-08-31 00:18:55 UTC (rev 20282)
@@ -49,8 +49,7 @@
 
     public String toSqlString( Criteria criteria, CriteriaQuery criteriaQuery )
             throws HibernateException {
-        String[] columns = criteriaQuery.getColumnsUsingProjection(
-                criteria, propertyName );
+        String[] columns = criteriaQuery.findColumns(propertyName, criteria);
         if ( criteriaQuery.getFactory().getDialect()
                 .supportsRowValueConstructorSyntaxInInList() || columns.length<=1) {
 

Modified: core/trunk/core/src/main/java/org/hibernate/criterion/LikeExpression.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/criterion/LikeExpression.java	2010-08-30 03:21:12 UTC (rev 20281)
+++ core/trunk/core/src/main/java/org/hibernate/criterion/LikeExpression.java	2010-08-31 00:18:55 UTC (rev 20282)
@@ -78,7 +78,7 @@
 			Criteria criteria,
 			CriteriaQuery criteriaQuery) throws HibernateException {
 		Dialect dialect = criteriaQuery.getFactory().getDialect();
-		String[] columns = criteriaQuery.getColumnsUsingProjection( criteria, propertyName );
+		String[] columns = criteriaQuery.findColumns(propertyName, criteria);
 		if ( columns.length != 1 ) {
 			throw new HibernateException( "Like may only be used with single-column properties" );
 		}

Modified: core/trunk/core/src/main/java/org/hibernate/criterion/NotNullExpression.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/criterion/NotNullExpression.java	2010-08-30 03:21:12 UTC (rev 20281)
+++ core/trunk/core/src/main/java/org/hibernate/criterion/NotNullExpression.java	2010-08-31 00:18:55 UTC (rev 20282)
@@ -46,7 +46,7 @@
 
 	public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery)
 	throws HibernateException {
-		String[] columns = criteriaQuery.getColumnsUsingProjection(criteria, propertyName);
+		String[] columns = criteriaQuery.findColumns(propertyName, criteria);
 		String result = StringHelper.join(
 			" or ",
 			StringHelper.suffix( columns, " is not null" )

Modified: core/trunk/core/src/main/java/org/hibernate/criterion/NullExpression.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/criterion/NullExpression.java	2010-08-30 03:21:12 UTC (rev 20281)
+++ core/trunk/core/src/main/java/org/hibernate/criterion/NullExpression.java	2010-08-31 00:18:55 UTC (rev 20282)
@@ -46,7 +46,7 @@
 
 	public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery) 
 	throws HibernateException {
-		String[] columns = criteriaQuery.getColumnsUsingProjection(criteria, propertyName);
+		String[] columns = criteriaQuery.findColumns(propertyName, criteria);
 		String result = StringHelper.join(
 			" and ",
 			StringHelper.suffix( columns, " is null" )

Modified: core/trunk/core/src/main/java/org/hibernate/criterion/PropertyExpression.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/criterion/PropertyExpression.java	2010-08-30 03:21:12 UTC (rev 20281)
+++ core/trunk/core/src/main/java/org/hibernate/criterion/PropertyExpression.java	2010-08-31 00:18:55 UTC (rev 20282)
@@ -49,8 +49,8 @@
 
 	public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery) 
 	throws HibernateException {
-		String[] xcols = criteriaQuery.getColumnsUsingProjection(criteria, propertyName);
-		String[] ycols = criteriaQuery.getColumnsUsingProjection(criteria, otherPropertyName);
+		String[] xcols = criteriaQuery.findColumns(propertyName, criteria);
+		String[] ycols = criteriaQuery.findColumns(otherPropertyName, criteria);
 		String result = StringHelper.join(
 			" and ",
 			StringHelper.add(xcols, getOp(), ycols)

Modified: core/trunk/core/src/main/java/org/hibernate/criterion/SimpleExpression.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/criterion/SimpleExpression.java	2010-08-30 03:21:12 UTC (rev 20281)
+++ core/trunk/core/src/main/java/org/hibernate/criterion/SimpleExpression.java	2010-08-31 00:18:55 UTC (rev 20282)
@@ -65,7 +65,7 @@
 	public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery)
 	throws HibernateException {
 
-		String[] columns = criteriaQuery.getColumnsUsingProjection(criteria, propertyName);
+		String[] columns = criteriaQuery.findColumns(propertyName, criteria);
 		Type type = criteriaQuery.getTypeUsingProjection(criteria, propertyName);
 		StringBuffer fragment = new StringBuffer();
 		if (columns.length>1) fragment.append('(');

Modified: core/trunk/core/src/main/java/org/hibernate/loader/criteria/CriteriaQueryTranslator.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/loader/criteria/CriteriaQueryTranslator.java	2010-08-30 03:21:12 UTC (rev 20281)
+++ core/trunk/core/src/main/java/org/hibernate/loader/criteria/CriteriaQueryTranslator.java	2010-08-31 00:18:55 UTC (rev 20282)
@@ -487,6 +487,27 @@
 				);
 	}
 
+	/**
+	 * Get the names of the columns mapped by a property path; if the
+	 * property path is not found in subcriteria, try the "outer" query.
+	 * Projection aliases are ignored.
+	 */
+	public String[] findColumns(String propertyName, Criteria subcriteria )
+	throws HibernateException {
+		try {
+			return getColumns( propertyName, subcriteria );
+		}
+		catch ( HibernateException he ) {
+			//not found in inner query, try the outer query
+			if ( outerQueryTranslator != null ) {
+				return outerQueryTranslator.findColumns( propertyName, subcriteria );
+			}
+			else {
+				throw he;
+			}
+		}
+	}
+
 	public Type getTypeUsingProjection(Criteria subcriteria, String propertyName)
 			throws HibernateException {
 

Modified: core/trunk/testsuite/src/test/java/org/hibernate/test/criteria/CriteriaQueryTest.java
===================================================================
--- core/trunk/testsuite/src/test/java/org/hibernate/test/criteria/CriteriaQueryTest.java	2010-08-30 03:21:12 UTC (rev 20281)
+++ core/trunk/testsuite/src/test/java/org/hibernate/test/criteria/CriteriaQueryTest.java	2010-08-31 00:18:55 UTC (rev 20282)
@@ -182,6 +182,17 @@
 			.add( Subqueries.eq("Gavin King", dc3) )
 			.list();
 
+		DetachedCriteria dc4 = DetachedCriteria.forClass(Student.class, "st")
+			.setProjection( Property.forName("name").as( "stname" ) );
+
+		dc4.getExecutableCriteria( session ).list();
+
+		dc4.getExecutableCriteria( session ).addOrder( Order.asc( "stname" ) ).list();
+
+		session.createCriteria(Enrolment.class, "e")
+			.add( Subqueries.eq("Gavin King", dc4) )
+			.list();
+
 		session.delete(enrolment2);
 		session.delete(gavin);
 		session.delete(course);
@@ -539,8 +550,8 @@
 		assertEquals(new Long(667),result[1]);
 		assertEquals(new Long(101),result[2]);
 		assertEquals( 384.0, ( (Double) result[3] ).doubleValue(), 0.01 );
+
 		
-		
 		List resultWithMaps = s.createCriteria(Enrolment.class)
 			.setProjection( Projections.distinct( Projections.projectionList()
 					.add( Projections.property("studentNumber"), "stNumber" )
@@ -740,6 +751,17 @@
 			}
 		}
 
+		resultList = s.createCriteria(Student.class)
+			.add(Restrictions.eq("name", "Gavin King"))
+			.setProjection( Projections.projectionList()
+					.add( Projections.id().as( "studentNumber" ))
+					.add( Property.forName( "name" ), "name" )
+					.add( Property.forName( "cityState" ), "cityState" )
+					.add( Property.forName("preferredCourse"), "preferredCourse" )
+			)
+			.list();
+		assertEquals( 1, resultList.size() );
+		
 		Object[] aResult = ( Object[] ) s.createCriteria(Student.class)
 			.add( Restrictions.idEq( new Long( 667 ) ) )
 			.setProjection( Projections.projectionList()
@@ -895,9 +917,37 @@
 					.add( Property.forName("year").group() )
 			)
 			.list();
+
+		assertEquals( list.size(), 2 );
+
+		list = s.createCriteria(Enrolment.class)
+			.createAlias("student", "st")
+			.createAlias("course", "co")
+			.setProjection( Projections.projectionList()
+					.add( Property.forName("co.courseCode").group().as( "courseCode" ))
+					.add( Property.forName("st.studentNumber").count().setDistinct().as( "studentNumber" ))
+					.add( Property.forName("year").group())
+			)
+			.addOrder( Order.asc( "courseCode" ) )
+			.addOrder( Order.asc( "studentNumber" ) )
+			.list();
+
+		assertEquals( list.size(), 2 );
 		
+		list = s.createCriteria(Enrolment.class)
+			.createAlias("student", "st")
+			.createAlias("course", "co")
+			.setProjection( Projections.projectionList()
+					.add( Property.forName("co.courseCode").group().as( "cCode" ))
+					.add( Property.forName("st.studentNumber").count().setDistinct().as( "stNumber" ))
+					.add( Property.forName("year").group())
+			)
+			.addOrder( Order.asc( "cCode" ) )
+			.addOrder( Order.asc( "stNumber" ) )
+			.list();
+
 		assertEquals( list.size(), 2 );
-		
+
 		s.delete(gavin);
 		s.delete(xam);
 		s.delete(course);



More information about the hibernate-commits mailing list