Skip to content

Commit 3630fba

Browse files
NathanQingyangXubeikov
authored andcommitted
HHH-15263 - @NamedQuery is not supported with UPDATE statement
1 parent 9d35e3d commit 3630fba

File tree

2 files changed

+22
-3
lines changed

2 files changed

+22
-3
lines changed

hibernate-core/src/main/java/org/hibernate/query/sqm/internal/QuerySqmImpl.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -817,14 +817,14 @@ public LockOptions getLockOptions() {
817817

818818
@Override
819819
public SqmQueryImplementor<R> setLockOptions(LockOptions lockOptions) {
820-
verifySelect();
820+
// No verifySelect call, because in Hibernate we support locking in subqueries
821821
getQueryOptions().getLockOptions().overlay( lockOptions );
822822
return this;
823823
}
824824

825825
@Override
826826
public SqmQueryImplementor<R> setLockMode(String alias, LockMode lockMode) {
827-
verifySelect();
827+
// No verifySelect call, because in Hibernate we support locking in subqueries
828828
getQueryOptions().getLockOptions().setAliasSpecificLockMode( alias, lockMode );
829829
return this;
830830
}
@@ -869,6 +869,7 @@ public SqmQueryImplementor<R> setFlushMode(FlushModeType flushMode) {
869869
@Override
870870
public SqmQueryImplementor<R> setLockMode(LockModeType lockMode) {
871871
if ( lockMode != LockModeType.NONE ) {
872+
// JPA requires an exception to be thrown when this is not a select statement
872873
verifySelect();
873874
}
874875
getSession().checkOpen( false );

hibernate-core/src/test/java/org/hibernate/orm/test/annotations/query/NamedQueryTest.java

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
import java.util.List;
1010

11+
import org.hibernate.testing.TestForIssue;
1112
import org.hibernate.testing.orm.junit.DomainModel;
1213
import org.hibernate.testing.orm.junit.SessionFactory;
1314
import org.hibernate.testing.orm.junit.SessionFactoryScope;
@@ -24,6 +25,7 @@
2425
import jakarta.persistence.NamedQuery;
2526
import jakarta.persistence.Query;
2627

28+
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
2729
import static org.junit.jupiter.api.Assertions.assertEquals;
2830

2931

@@ -71,6 +73,19 @@ public void testNamedQueriesOrdinalParametersAreOneBased(SessionFactoryScope sco
7173
);
7274
}
7375

76+
@Test
77+
@TestForIssue( jiraKey = "HHH-15263" )
78+
public void testNoExceptionThrownForNamedUpdate(SessionFactoryScope scope) {
79+
scope.inTransaction(
80+
session -> {
81+
Query query = session.getNamedQuery( "NamedUpdate" );
82+
query.setParameter( 1, GAME_TITLES[0] + " 2" );
83+
query.setParameter( 2, GAME_TITLES[0] );
84+
assertDoesNotThrow( () -> query.executeUpdate(), "without fixing, 'java.lang.IllegalStateException: Expecting a SELECT query' exception would be thrown" );
85+
}
86+
);
87+
}
88+
7489
@Test
7590
public void testNativeNamedQueriesOrdinalParametersAreOneBased(SessionFactoryScope scope) {
7691
scope.inTransaction(
@@ -84,7 +99,10 @@ public void testNativeNamedQueriesOrdinalParametersAreOneBased(SessionFactorySco
8499
}
85100

86101
@Entity(name = "Game")
87-
@NamedQueries(@NamedQuery(name = "NamedQuery", query = "select g from Game g where title = ?1"))
102+
@NamedQueries({
103+
@NamedQuery(name = "NamedQuery", query = "select g from Game g where title = ?1"),
104+
@NamedQuery(name = "NamedUpdate", query = "update Game set title = ?1 where title = ?2")
105+
})
88106
@NamedNativeQueries(@NamedNativeQuery(name = "NamedNativeQuery", query = "select * from Game g where title = ?"))
89107
public static class Game {
90108
private Long id;

0 commit comments

Comments
 (0)