Tests for `order by` expression(s) not included in `select` clause
This commit is contained in:
parent
08028be1e9
commit
77f6af42e7
|
@ -0,0 +1,113 @@
|
|||
/*
|
||||
* Hibernate, Relational Persistence for Idiomatic Java
|
||||
*
|
||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
|
||||
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
|
||||
*/
|
||||
package org.hibernate.orm.test.orderby;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.hibernate.dialect.SybaseDialect;
|
||||
|
||||
import org.hibernate.testing.orm.junit.DomainModel;
|
||||
import org.hibernate.testing.orm.junit.SessionFactory;
|
||||
import org.hibernate.testing.orm.junit.SessionFactoryScope;
|
||||
import org.hibernate.testing.orm.junit.SkipForDialect;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import jakarta.persistence.Entity;
|
||||
import jakarta.persistence.Id;
|
||||
import jakarta.persistence.ManyToOne;
|
||||
import jakarta.persistence.OneToMany;
|
||||
|
||||
/**
|
||||
* @author Marco Belladelli
|
||||
*/
|
||||
@DomainModel( annotatedClasses = {
|
||||
OrderByExpressionNotInSelectTest.Person.class,
|
||||
OrderByExpressionNotInSelectTest.Travel.class,
|
||||
} )
|
||||
@SessionFactory
|
||||
public class OrderByExpressionNotInSelectTest {
|
||||
@Test
|
||||
public void testSimplePath(SessionFactoryScope scope) {
|
||||
scope.inSession( session -> {
|
||||
// simple path
|
||||
session.createQuery( "select p.name from Person p order by p.age", String.class ).getResultList();
|
||||
// simple path multiple orders
|
||||
session.createQuery( "select p.name from Person p order by p.name, p.age", String.class ).getResultList();
|
||||
// function path
|
||||
session.createQuery( "select p.age from Person p order by upper(p.name)", Integer.class ).getResultList();
|
||||
// same path function sort
|
||||
session.createQuery( "select p.name from Person p order by upper(p.name)", String.class ).getResultList();
|
||||
// same path function selection
|
||||
session.createQuery( "select upper(p.name) from Person p order by p.name", String.class ).getResultList();
|
||||
// same function path selection and sort
|
||||
session.createQuery( "select upper(p.name) from Person p order by upper(p.name)", String.class ).getResultList();
|
||||
// different function path selection and sort
|
||||
session.createQuery( "select upper(p.name) from Person p order by lower(p.name)", String.class ).getResultList();
|
||||
} );
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testToOne(SessionFactoryScope scope) {
|
||||
scope.inTransaction( session -> {
|
||||
// select root and sort by path
|
||||
session.createQuery( "select p.age from Person p order by p.consort", Integer.class ).getResultList();
|
||||
// select and sort by implicit to-one
|
||||
session.createQuery( "select p.consort from Person p order by p.consort", Person.class ).getResultList();
|
||||
// select and sort by explicit to-one
|
||||
session.createQuery( "select c from Person p join p.consort c order by c", Person.class ).getResultList();
|
||||
// select and sort by explicit subpath
|
||||
session.createQuery( "select c.name from Person p join p.consort c order by c.age", String.class ).getResultList();
|
||||
} );
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testToMany(SessionFactoryScope scope) {
|
||||
scope.inTransaction( session -> {
|
||||
// order by whole element
|
||||
session.createQuery( "select p.age from Person p left join p.travels t order by element(t)", Integer.class ).getResultList();
|
||||
// order by subpath
|
||||
session.createQuery( "select p.name from Person p left join p.travels t order by element(t).destination", String.class ).getResultList();
|
||||
// select and order by different subpaths
|
||||
session.createQuery( "select element(t).id from Person p left join p.travels t order by element(t).destination", Integer.class ).getResultList();
|
||||
} );
|
||||
}
|
||||
|
||||
@Test
|
||||
@SkipForDialect( dialectClass = SybaseDialect.class, reason = "Sybase doesn't support order by in a derived table", matchSubTypes = true )
|
||||
public void testSubquery(SessionFactoryScope scope) {
|
||||
scope.inTransaction( session -> {
|
||||
// test order by in subquery
|
||||
session.createQuery( "select p.name from (select pers.name as name from Person pers order by pers.age limit 1) p", String.class ).getResultList();
|
||||
// test order by in main query
|
||||
session.createQuery( "select p.name from (select pers.name as name, pers.age as age from Person pers) p order by p.age", String.class ).getResultList();
|
||||
} );
|
||||
}
|
||||
|
||||
@Entity( name = "Person" )
|
||||
static class Person {
|
||||
@Id
|
||||
private Long id;
|
||||
|
||||
private Integer age;
|
||||
|
||||
private String name;
|
||||
|
||||
@ManyToOne
|
||||
private Person consort;
|
||||
|
||||
@OneToMany
|
||||
private List<Travel> travels;
|
||||
}
|
||||
|
||||
@Entity( name = "Travel" )
|
||||
static class Travel {
|
||||
@Id
|
||||
private Integer id;
|
||||
|
||||
private String destination;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue