HHH-17391 HHH-17392 Skip checking existing selection for OVER clause
This commit is contained in:
parent
4e73ffca20
commit
ef4609baad
|
@ -2338,7 +2338,7 @@ public abstract class BaseSqmToSqlAstConverter<T extends Statement> extends Base
|
||||||
sqmPosition = aliasedNodeOrdinal - 1;
|
sqmPosition = aliasedNodeOrdinal - 1;
|
||||||
path = aliasedNodeRef.getNavigablePath();
|
path = aliasedNodeRef.getNavigablePath();
|
||||||
}
|
}
|
||||||
else if ( statement.getQuerySource() == SqmQuerySource.CRITERIA ) {
|
else if ( statement.getQuerySource() == SqmQuerySource.CRITERIA && currentClauseStack.getCurrent() != Clause.OVER ) {
|
||||||
// In JPA Criteria we could be using the same expression object for the group/order by and select item
|
// In JPA Criteria we could be using the same expression object for the group/order by and select item
|
||||||
// We try to find the select item position for this expression here which is not necessarily just an optimization.
|
// We try to find the select item position for this expression here which is not necessarily just an optimization.
|
||||||
// This is vital to enable the support for parameters in these expressions.
|
// This is vital to enable the support for parameters in these expressions.
|
||||||
|
|
|
@ -21,6 +21,7 @@ import org.hibernate.testing.orm.domain.StandardDomainModel;
|
||||||
import org.hibernate.testing.orm.domain.gambit.EntityOfBasics;
|
import org.hibernate.testing.orm.domain.gambit.EntityOfBasics;
|
||||||
import org.hibernate.testing.orm.junit.DialectFeatureChecks;
|
import org.hibernate.testing.orm.junit.DialectFeatureChecks;
|
||||||
import org.hibernate.testing.orm.junit.DomainModel;
|
import org.hibernate.testing.orm.junit.DomainModel;
|
||||||
|
import org.hibernate.testing.orm.junit.Jira;
|
||||||
import org.hibernate.testing.orm.junit.RequiresDialectFeature;
|
import org.hibernate.testing.orm.junit.RequiresDialectFeature;
|
||||||
import org.hibernate.testing.orm.junit.ServiceRegistry;
|
import org.hibernate.testing.orm.junit.ServiceRegistry;
|
||||||
import org.hibernate.testing.orm.junit.SessionFactory;
|
import org.hibernate.testing.orm.junit.SessionFactory;
|
||||||
|
@ -134,6 +135,48 @@ public class CriteriaWindowFunctionTest {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Jira( "https://hibernate.atlassian.net/browse/HHH-17391" )
|
||||||
|
public void testRowNumberMultiSelectGroupBy(final SessionFactoryScope scope) {
|
||||||
|
scope.inTransaction(
|
||||||
|
session -> {
|
||||||
|
final HibernateCriteriaBuilder cb = session.getCriteriaBuilder();
|
||||||
|
final CriteriaQuery<Tuple> cr = cb.createQuery( Tuple.class );
|
||||||
|
final Root<EntityOfBasics> root = cr.from( EntityOfBasics.class );
|
||||||
|
|
||||||
|
final JpaWindow window = cb.createWindow();
|
||||||
|
window.partitionBy( root.get( "id" ) ).orderBy( cb.asc( root.get( "id" ) ) );
|
||||||
|
final JpaExpression<Long> rowNumber = cb.rowNumber( window );
|
||||||
|
|
||||||
|
cr.multiselect( root.get( "id" ), rowNumber ).groupBy( root.get( "id" ) );
|
||||||
|
final List<Tuple> resultList = session.createQuery( cr ).getResultList();
|
||||||
|
assertEquals( 5, resultList.size() );
|
||||||
|
resultList.forEach( tuple -> assertEquals( 1L, tuple.get( 1, Long.class ) ) );
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Jira( "https://hibernate.atlassian.net/browse/HHH-17392" )
|
||||||
|
public void testRowNumberMultiSelect(final SessionFactoryScope scope) {
|
||||||
|
scope.inTransaction(
|
||||||
|
session -> {
|
||||||
|
final HibernateCriteriaBuilder cb = session.getCriteriaBuilder();
|
||||||
|
final CriteriaQuery<Tuple> cr = cb.createQuery( Tuple.class );
|
||||||
|
final Root<EntityOfBasics> root = cr.from( EntityOfBasics.class );
|
||||||
|
|
||||||
|
final JpaWindow window = cb.createWindow();
|
||||||
|
window.partitionBy( root.get( "id" ) ).orderBy( cb.asc( root.get( "id" ) ) );
|
||||||
|
final JpaExpression<Long> rowNumber = cb.rowNumber( window );
|
||||||
|
|
||||||
|
cr.multiselect( root.get( "id" ), rowNumber );
|
||||||
|
final List<Tuple> resultList = session.createQuery( cr ).getResultList();
|
||||||
|
assertEquals( 5, resultList.size() );
|
||||||
|
resultList.forEach( tuple -> assertEquals( 1L, tuple.get( 1, Long.class ) ) );
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testFirstValue(SessionFactoryScope scope) {
|
public void testFirstValue(SessionFactoryScope scope) {
|
||||||
scope.inTransaction(
|
scope.inTransaction(
|
||||||
|
|
Loading…
Reference in New Issue