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);