HHH-18353 Add test for issue
This commit is contained in:
parent
12cd4a69ca
commit
a5b353b34b
|
@ -0,0 +1,144 @@
|
||||||
|
package org.hibernate.orm.test.function.array;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
import org.hibernate.dialect.OracleDialect;
|
||||||
|
|
||||||
|
import org.hibernate.testing.jdbc.SharedDriverManagerTypeCacheClearingIntegrator;
|
||||||
|
import org.hibernate.testing.orm.junit.BootstrapServiceRegistry;
|
||||||
|
import org.hibernate.testing.orm.junit.DialectFeatureChecks;
|
||||||
|
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.SessionFactory;
|
||||||
|
import org.hibernate.testing.orm.junit.SessionFactoryScope;
|
||||||
|
import org.junit.jupiter.api.AfterEach;
|
||||||
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import jakarta.persistence.Entity;
|
||||||
|
import jakarta.persistence.Id;
|
||||||
|
import jakarta.persistence.ManyToOne;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
|
||||||
|
|
||||||
|
@DomainModel(
|
||||||
|
annotatedClasses = {
|
||||||
|
ArrayConstructorInSelectClauseTest.Book.class,
|
||||||
|
ArrayConstructorInSelectClauseTest.Author.class
|
||||||
|
})
|
||||||
|
@SessionFactory
|
||||||
|
@RequiresDialectFeature(feature = DialectFeatureChecks.SupportsStructuralArrays.class)
|
||||||
|
// Clear the type cache, otherwise we might run into ORA-21700: object does not exist or is marked for delete
|
||||||
|
@BootstrapServiceRegistry(integrators = SharedDriverManagerTypeCacheClearingIntegrator.class)
|
||||||
|
public class ArrayConstructorInSelectClauseTest {
|
||||||
|
private static final Long AUTHOR_ID = 1l;
|
||||||
|
private static final Long CO_AUTHOR_ID = 2l;
|
||||||
|
private static final Long BOOK_ID = 3l;
|
||||||
|
|
||||||
|
@BeforeEach
|
||||||
|
public void setUp(SessionFactoryScope scope) {
|
||||||
|
scope.inTransaction(
|
||||||
|
session -> {
|
||||||
|
var dialect = session.getDialect();
|
||||||
|
if ( dialect instanceof OracleDialect ) {
|
||||||
|
session.createNativeQuery(
|
||||||
|
"create or replace type LongArray as varying array(127) of number(19,0)" )
|
||||||
|
.executeUpdate();
|
||||||
|
}
|
||||||
|
var author = new Author( AUTHOR_ID, "D Thomas" );
|
||||||
|
var coAuthor = new Author( CO_AUTHOR_ID, "A Hunt" );
|
||||||
|
session.persist( author );
|
||||||
|
session.persist( coAuthor );
|
||||||
|
|
||||||
|
var book = new Book( BOOK_ID, "The Pragmatic Programmer", author, coAuthor );
|
||||||
|
session.persist( book );
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@AfterEach
|
||||||
|
public void tearDown(SessionFactoryScope scope) {
|
||||||
|
scope.inTransaction(
|
||||||
|
session -> {
|
||||||
|
session.createMutationQuery( "delete from Book" ).executeUpdate();
|
||||||
|
session.createMutationQuery( "delete from Author" ).executeUpdate();
|
||||||
|
var dialect = session.getDialect();
|
||||||
|
if ( dialect instanceof OracleDialect ) {
|
||||||
|
session.createNativeQuery( "drop type LongArray" ).executeUpdate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Jira("HHH-18353")
|
||||||
|
public void testArraySelectionNoCast(SessionFactoryScope scope) {
|
||||||
|
scope.inTransaction(
|
||||||
|
session -> {
|
||||||
|
var query = session.createQuery(
|
||||||
|
"SELECT ARRAY(b.author.id, b.coAuthor.id) FROM Book b WHERE b.id = :bookId",
|
||||||
|
Long[].class
|
||||||
|
).setParameter( "bookId", BOOK_ID );
|
||||||
|
|
||||||
|
assertThat( query.getSingleResult() ).containsAll( Arrays.asList( AUTHOR_ID, CO_AUTHOR_ID ) );
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testArraySelectionCast(SessionFactoryScope scope) {
|
||||||
|
scope.inTransaction(
|
||||||
|
session -> {
|
||||||
|
var query = session.createQuery(
|
||||||
|
"SELECT ARRAY(CAST(b.author.id as Long), CAST(b.coAuthor.id as Long)) FROM Book b WHERE b.id = :bookId",
|
||||||
|
Long[].class
|
||||||
|
).setParameter( "bookId", BOOK_ID );
|
||||||
|
|
||||||
|
assertThat( query.getSingleResult() ).containsAll( Arrays.asList( AUTHOR_ID, CO_AUTHOR_ID ) );
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Entity(name = "Author")
|
||||||
|
public static class Author {
|
||||||
|
|
||||||
|
@Id
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
public Author() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public Author(Long id, String name) {
|
||||||
|
this.id = id;
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Entity(name = "Book")
|
||||||
|
public static class Book {
|
||||||
|
|
||||||
|
@Id
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
private String title;
|
||||||
|
|
||||||
|
@ManyToOne
|
||||||
|
private Author author;
|
||||||
|
|
||||||
|
@ManyToOne
|
||||||
|
private Author coAuthor;
|
||||||
|
|
||||||
|
public Book() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public Book(long id, String title, Author author, Author coAuthor) {
|
||||||
|
this.id = id;
|
||||||
|
this.title = title;
|
||||||
|
this.author = author;
|
||||||
|
this.coAuthor = coAuthor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue