When using Detached Criteria Builder for criteria or projection subqueries, you must use a projection. If you think about it from a SQL perspective, this makes sense. After all, we need our subquery to return a specific result (property values, a count, etc.) which will be compared to a property value on the root table (in the case of a criteria subquery), or which will be returned as a valid column value (in the case of a projection subquery).
All of the projections available for Criteria Builder are also available for Detached Criteria Builder.
Examples
c = newCriteria();c.add(c.createSubcriteria( ‘Car’, ‘CarSub’ )// result of subquery will be CarIDs.withProjections( property=’CarID’ ).isEq( ‘Make’, ‘Ford’ ).propertyIn( ‘CarID’ )).list();
Be careful when using projections and adding criterias to your query. Hibernate does not work well with projections and alias definitions, so if you want to add a criteria you must use this.yourPropertyName
to tell Hibernate not to use the alias and build a correct SQL.
var c = newCriteria();oReviews = c.withProjections(property="status,ID,rating,isComplete");c.isTrue( "this.isComplete" );c.gt( "this.rating", JavaCast( "float", 0 ) );oReviews = c.resultTransformer( c.ALIAS_TO_ENTITY_MAP ).list();