diff --git a/hibernate-core/src/main/java/org/hibernate/internal/AbstractSharedSessionContract.java b/hibernate-core/src/main/java/org/hibernate/internal/AbstractSharedSessionContract.java index e147da2c29..118e78ab33 100644 --- a/hibernate-core/src/main/java/org/hibernate/internal/AbstractSharedSessionContract.java +++ b/hibernate-core/src/main/java/org/hibernate/internal/AbstractSharedSessionContract.java @@ -966,6 +966,10 @@ public abstract class AbstractSharedSessionContract implements SharedSessionCont throw new IllegalArgumentException( "Cannot create TypedQuery for query with more than one return" ); } + if ( queryReturns.length == 0 ) { + throw new IllegalArgumentException("Named query exists but its result type is not compatible"); + } + final NativeSQLQueryReturn nativeSQLQueryReturn = queryReturns[0]; if ( nativeSQLQueryReturn instanceof NativeSQLQueryRootReturn ) { diff --git a/hibernate-core/src/test/java/org/hibernate/jpa/test/query/NamedQueryTest.java b/hibernate-core/src/test/java/org/hibernate/jpa/test/query/NamedQueryTest.java index 682996be91..309976b4f8 100644 --- a/hibernate-core/src/test/java/org/hibernate/jpa/test/query/NamedQueryTest.java +++ b/hibernate-core/src/test/java/org/hibernate/jpa/test/query/NamedQueryTest.java @@ -19,6 +19,7 @@ import javax.persistence.Query; import org.hibernate.Session; import org.hibernate.jpa.test.BaseEntityManagerFunctionalTestCase; import org.hibernate.query.NativeQuery; + import org.hibernate.testing.TestForIssue; import org.junit.After; import org.junit.Before; @@ -26,6 +27,7 @@ import org.junit.Test; import static org.hibernate.testing.transaction.TransactionUtil.doInJPA; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThrows; /** * @author Andrea Boriero @@ -33,11 +35,11 @@ import static org.junit.Assert.assertEquals; @TestForIssue(jiraKey = "HHH-11092") public class NamedQueryTest extends BaseEntityManagerFunctionalTestCase { - private static final String[] GAME_TITLES = {"Halo", "Grand Theft Auto", "NetHack"}; + private static final String[] GAME_TITLES = { "Halo", "Grand Theft Auto", "NetHack" }; @Override public Class[] getAnnotatedClasses() { - return new Class[] {Game.class}; + return new Class[] { Game.class }; } @Before @@ -178,6 +180,18 @@ public class NamedQueryTest extends BaseEntityManagerFunctionalTestCase { } ); } + @Test + @TestForIssue(jiraKey = "HHH-11413") + public void testNamedNativeQueryExceptionNoRedultDefined() { + doInJPA( this::entityManagerFactory, entityManager -> { + assertThrows( + "Named query exists but its result type is not compatible", + IllegalArgumentException.class, + () -> entityManager.createNamedQuery( "NamedNativeQuery", Game.class ) + ); + } ); + } + @Entity(name = "Game") @NamedQueries(@NamedQuery(name = "NamedQuery", query = "select g from Game g where title = ?1")) @NamedNativeQueries(@NamedNativeQuery(name = "NamedNativeQuery", query = "select * from Game g where title = ?"))