support for selecting of joined plural attributes
This commit is contained in:
parent
19fbf18908
commit
9348952507
|
@ -41,6 +41,7 @@ import org.hibernate.grammars.hql.HqlParser;
|
||||||
import org.hibernate.grammars.hql.HqlParserBaseVisitor;
|
import org.hibernate.grammars.hql.HqlParserBaseVisitor;
|
||||||
import org.hibernate.internal.util.collections.Stack;
|
import org.hibernate.internal.util.collections.Stack;
|
||||||
import org.hibernate.internal.util.collections.StandardStack;
|
import org.hibernate.internal.util.collections.StandardStack;
|
||||||
|
import org.hibernate.jpa.spi.JpaCompliance;
|
||||||
import org.hibernate.metamodel.CollectionClassification;
|
import org.hibernate.metamodel.CollectionClassification;
|
||||||
import org.hibernate.metamodel.model.domain.AllowableFunctionReturnType;
|
import org.hibernate.metamodel.model.domain.AllowableFunctionReturnType;
|
||||||
import org.hibernate.metamodel.model.domain.BasicDomainType;
|
import org.hibernate.metamodel.model.domain.BasicDomainType;
|
||||||
|
@ -825,7 +826,29 @@ public class SemanticQueryBuilder<R> extends HqlParserBaseVisitor<Object> implem
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( ctx.selectExpression().expression() != null ) {
|
if ( ctx.selectExpression().expression() != null ) {
|
||||||
return (SqmExpression) ctx.selectExpression().expression().accept( this );
|
final SqmExpression<?> sqmExpression = (SqmExpression<?>) ctx.selectExpression().expression().accept( this );
|
||||||
|
if ( sqmExpression instanceof SqmPath ) {
|
||||||
|
final SqmPath<?> sqmPath = (SqmPath<?>) sqmExpression;
|
||||||
|
if ( sqmPath.getReferencedPathSource() instanceof PluralPersistentAttribute ) {
|
||||||
|
// for plural-attribute selections, use the element path as the selection
|
||||||
|
// - this is not strictly JPA compliant
|
||||||
|
if ( creationOptions.useStrictJpaCompliance() ) {
|
||||||
|
SqmTreeCreationLogger.LOGGER.debugf(
|
||||||
|
"Raw selection of plural attribute not supported by JPA: %s. Use `value(%s)` or `key(%s)` to indicate what part of the collection to select",
|
||||||
|
sqmPath.getAlias(),
|
||||||
|
sqmPath.getAlias(),
|
||||||
|
sqmPath.getAlias()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
final PluralPersistentAttribute<?,?,?> pluralAttribute = (PluralPersistentAttribute<?,?,?>) sqmPath.getReferencedPathSource();
|
||||||
|
final SqmPath<?> elementPath = pluralAttribute.getElementPathSource().createSqmPath( sqmPath );
|
||||||
|
processingStateStack.getCurrent().getPathRegistry().register( elementPath );
|
||||||
|
return elementPath;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return sqmExpression;
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new ParsingException( "Unexpected selection rule type : " + ctx.getText() );
|
throw new ParsingException( "Unexpected selection rule type : " + ctx.getText() );
|
||||||
|
|
|
@ -6,11 +6,21 @@
|
||||||
*/
|
*/
|
||||||
package org.hibernate.sql.ast.tree.predicate;
|
package org.hibernate.sql.ast.tree.predicate;
|
||||||
|
|
||||||
|
import org.hibernate.sql.ast.spi.SqlAstTreeHelper;
|
||||||
import org.hibernate.sql.ast.tree.SqlAstNode;
|
import org.hibernate.sql.ast.tree.SqlAstNode;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* Models a predicate in the SQL AST
|
||||||
|
*
|
||||||
* @author Steve Ebersole
|
* @author Steve Ebersole
|
||||||
*/
|
*/
|
||||||
public interface Predicate extends SqlAstNode {
|
public interface Predicate extends SqlAstNode {
|
||||||
|
/**
|
||||||
|
* Short-cut for {@link SqlAstTreeHelper#combinePredicates}
|
||||||
|
*/
|
||||||
|
static Predicate combinePredicates(Predicate p1, Predicate p2) {
|
||||||
|
return SqlAstTreeHelper.combinePredicates( p1, p2 );
|
||||||
|
}
|
||||||
|
|
||||||
boolean isEmpty();
|
boolean isEmpty();
|
||||||
}
|
}
|
||||||
|
|
|
@ -214,6 +214,25 @@ public class SelectClauseTests extends BaseSqmUnitTest {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testPluralJoinSelection() {
|
||||||
|
collectionValueFunctionAssertions(
|
||||||
|
interpretSelect( "select l from EntityOfLists e join e.listOfBasics l" ),
|
||||||
|
EntityOfLists.class.getName() + ".listOfBasics",
|
||||||
|
"l"
|
||||||
|
);
|
||||||
|
collectionValueFunctionAssertions(
|
||||||
|
interpretSelect( "select l from EntityOfLists e join e.listOfComponents l" ),
|
||||||
|
EntityOfLists.class.getName() + ".listOfComponents",
|
||||||
|
"l"
|
||||||
|
);
|
||||||
|
collectionValueFunctionAssertions(
|
||||||
|
interpretSelect( "select l from EntityOfLists e join e.listOfOneToMany l" ),
|
||||||
|
EntityOfLists.class.getName() + ".listOfOneToMany",
|
||||||
|
"l"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testCollectionValueFunction() {
|
public void testCollectionValueFunction() {
|
||||||
collectionValueFunctionAssertions(
|
collectionValueFunctionAssertions(
|
||||||
|
|
Loading…
Reference in New Issue