Skip to content

Commit

Permalink
HHH-13140 Criteria API multiselect aliases are not passed through to …
Browse files Browse the repository at this point in the history
…the JPQL query and they are not available in ResultTransformer
  • Loading branch information
dreab8 committed Sep 25, 2021
1 parent 6cb13dd commit ca83c6c
Show file tree
Hide file tree
Showing 8 changed files with 23 additions and 42 deletions.
Expand Up @@ -21,6 +21,7 @@
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.internal.EmptyScrollableResults;
import org.hibernate.internal.util.collections.ArrayHelper;
import org.hibernate.metamodel.mapping.MappingModelExpressable;
import org.hibernate.query.IllegalQueryOperationException;
import org.hibernate.query.criteria.JpaSelection;
Expand Down Expand Up @@ -188,19 +189,15 @@ private RowTransformer<R> makeRowTransformerTupleTransformerAdapter(
SqmSelectStatement sqm,
QueryOptions queryOptions) {
final List<String> aliases = new ArrayList<>();
sqm.getQuerySpec().getSelectClause().getSelections()
.stream()
.forEach(
sqmSelection -> {
final String[] selectionAliases = sqmSelection.getAliases();
for ( int i = 0; i < selectionAliases.length; i++ ) {
final String alias = selectionAliases[i];
aliases.add( alias );
}
}
);
sqm.getQuerySpec().getSelectClause().getSelections().forEach(
sqmSelection ->
sqmSelection.getSelectableNode().visitSubSelectableNodes(
subSelection -> aliases.add( subSelection.getAlias() )
)
);

return new RowTransformerTupleTransformerAdapter<>(
aliases.toArray( new String[] {} ), queryOptions.getTupleTransformer()
ArrayHelper.toStringArray( aliases ), queryOptions.getTupleTransformer()
);
}

Expand Down
Expand Up @@ -33,6 +33,7 @@
import org.hibernate.metamodel.model.domain.SingularPersistentAttribute;
import org.hibernate.query.NavigablePath;
import org.hibernate.query.criteria.JpaPath;
import org.hibernate.query.criteria.JpaSelection;
import org.hibernate.query.sqm.NodeBuilder;
import org.hibernate.query.SemanticException;
import org.hibernate.query.sqm.SqmPathSource;
Expand Down Expand Up @@ -608,4 +609,12 @@ public void appendHqlString(StringBuilder sb) {
sb.append( alias );
}
}

@Override
public JpaSelection<T> alias(String name) {
if ( getExplicitAlias() == null ) {
setExplicitAlias( name );
}
return super.alias( name );
}
}
Expand Up @@ -105,9 +105,4 @@ public SqmAttributeJoin<O, E> makeCopy(SqmCreationProcessingState creationProces
nodeBuilder()
);
}

@Override
public String getAlias() {
return getExplicitAlias();
}
}
Expand Up @@ -84,9 +84,4 @@ public SqmAttributeJoin<O, T> makeCopy(SqmCreationProcessingState creationProces
nodeBuilder()
);
}

@Override
public String getAlias() {
return getExplicitAlias();
}
}
Expand Up @@ -7,6 +7,7 @@
package org.hibernate.query.sqm.tree.select;

import java.util.List;
import java.util.function.Consumer;

import javax.persistence.criteria.Selection;

Expand Down Expand Up @@ -99,14 +100,6 @@ public String getAlias() {
return null;
}

public String[] getAliases() {
String[] aliases = new String[selectableNodes.size()];
for ( int i = 0; i < selectableNodes.size(); i++ ) {
aliases[i] = selectableNodes.get( i ).getAlias();
}
return aliases;
}

@Override
public boolean isCompoundSelection() {
return true;
Expand All @@ -124,7 +117,10 @@ public void appendHqlString(StringBuilder sb) {
sb.append(", ");
selectableNodes.get( i ).appendHqlString( sb );
}

}

@Override
public void visitSubSelectableNodes(Consumer<SqmSelectableNode<?>> jpaSelectionConsumer) {
selectableNodes.forEach( jpaSelectionConsumer );
}
}
Expand Up @@ -29,8 +29,4 @@ public interface SqmSelectableNode<T> extends JpaSelection<T>, SqmTypedNode<T>,
* @see Selection#getCompoundSelectionItems()
*/
void visitSubSelectableNodes(Consumer<SqmSelectableNode<?>> jpaSelectionConsumer);

default String[] getAliases() {
return new String[] { getAlias() };
}
}
Expand Up @@ -50,10 +50,6 @@ public String getAlias() {
return selectableNode.getAlias();
}

public String[] getAliases() {
return selectableNode.getAliases();
}

@Override
public <X> X accept(SemanticQueryWalker<X> walker) {
return walker.visitSelection( this );
Expand Down
Expand Up @@ -19,7 +19,6 @@

import org.hibernate.jpa.test.BaseEntityManagerFunctionalTestCase;
import org.hibernate.query.Query;
import org.hibernate.testing.FailureExpected;
import org.hibernate.testing.TestForIssue;
import org.hibernate.transform.Transformers;
import org.junit.Before;
Expand Down Expand Up @@ -49,7 +48,6 @@ public void init() {
}

@Test
@FailureExpected(jiraKey = "HHH-13140")
@TestForIssue(jiraKey = "HHH-13140")
public void testAlias() {
doInJPA( this::entityManagerFactory, entityManager -> {
Expand All @@ -76,7 +74,6 @@ public void testAlias() {
}

@Test
@FailureExpected(jiraKey = "HHH-13140")
@TestForIssue(jiraKey = "HHH-13192")
public void testNoAliasInWhereClause() {
doInJPA( this::entityManagerFactory, entityManager -> {
Expand Down

0 comments on commit ca83c6c

Please sign in to comment.