diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/query/sql/NativeQueryAsNamedTests.java b/hibernate-core/src/test/java/org/hibernate/orm/test/query/sql/NativeQueryAsNamedTests.java new file mode 100644 index 0000000000..3d8e5392d9 --- /dev/null +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/query/sql/NativeQueryAsNamedTests.java @@ -0,0 +1,101 @@ +/* + * 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.query.sql; + +import org.hibernate.dialect.H2Dialect; +import org.hibernate.engine.spi.SessionImplementor; +import org.hibernate.query.NativeQuery; +import org.hibernate.query.Query; +import org.hibernate.query.spi.QueryImplementor; + +import org.hibernate.testing.orm.junit.DomainModel; +import org.hibernate.testing.orm.junit.FailureExpected; +import org.hibernate.testing.orm.junit.JiraKey; +import org.hibernate.testing.orm.junit.RequiresDialect; +import org.hibernate.testing.orm.junit.SessionFactory; +import org.hibernate.testing.orm.junit.SessionFactoryScope; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +/** + * @author Steve Ebersole + */ +@RequiresDialect(H2Dialect.class) +@DomainModel +@SessionFactory +public class NativeQueryAsNamedTests { + private static final String THE_CREATE = "create table ce_generic_data ( " + + " parent_id bigint, " + + " parent_type varchar(50), " + + " generic_data_definition_id bigint, " + + " creator_id bigint" + + ")"; + + private static final String THE_SELECT = "select parent_id " + + "from ce_generic_data " + + "where parent_id > ?2 " + + " and parent_type = ?1 " + + " and generic_data_definition_id < ?2 " + + " and creator_id <> ?3"; + + /** + * Port of the test attached on HHH-16068 + */ + @Test + @JiraKey( "HHH-16068" ) + public void testParameters(SessionFactoryScope scope) { + scope.inTransaction( (session) -> { + final NativeQuery nativeQuery = session.createNativeQuery(THE_SELECT); + bindParameters( nativeQuery, session ); + nativeQuery.list(); + + // now add it as a named query + session.getSessionFactory().addNamedQuery( "the_select", nativeQuery ); + + // and execute it as a named query + final QueryImplementor namedQuery = session.createNamedQuery( "the_select" ); + bindParameters( namedQuery, session ); + namedQuery.list(); + } ); + } + + /** + * Seems like this should work, but currently does not + */ + @Test + @FailureExpected( reason = "Session#createNamedQuery for a native-query does not like passing the result-class" ) + public void testResultClass(SessionFactoryScope scope) { + scope.inTransaction( (session) -> { + final NativeQuery nativeQuery = session.createNativeQuery( THE_SELECT, String.class ); + bindParameters( nativeQuery, session ); + nativeQuery.list(); + + // now add it as a named query + session.getSessionFactory().addNamedQuery( "the_select", nativeQuery ); + + // and execute it as a named query + final QueryImplementor namedQuery = session.createNamedQuery( "the_select", String.class ); + bindParameters( namedQuery, session ); + namedQuery.list(); + } ); + } + + private void bindParameters(Query query, SessionImplementor session) { + query.setParameter(1, "98C1"); + query.setParameter(2, 1000L); + query.setParameter(3, 2000L); + } + + @BeforeAll + public void createSchema(SessionFactoryScope scope) { + scope.inTransaction( (session) -> { + session.doWork( (connection) -> { + session.createNativeMutationQuery( THE_CREATE ).executeUpdate(); + } ); + } ); + } +}