Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit f2db730

Browse files
rmartincSanne
authored andcommitted
HHH-14796 Cannot replace an existing JPQL NamedQuery with a native NamedQuery
1 parent 859280f commit f2db730

File tree

2 files changed

+53
-0
lines changed

2 files changed

+53
-0
lines changed

hibernate-core/src/main/java/org/hibernate/query/spi/NamedQueryRepository.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,14 @@ public ResultSetMappingDefinition getResultSetMappingDefinition(String mappingNa
9292
return namedSqlResultSetMappingMap.get( mappingName );
9393
}
9494

95+
private synchronized void removeNamedQueryDefinition(String name) {
96+
if ( this.namedQueryDefinitionMap.containsKey( name ) ) {
97+
final Map<String, NamedQueryDefinition> copy = CollectionHelper.makeCopy( namedQueryDefinitionMap );
98+
copy.remove( name );
99+
this.namedQueryDefinitionMap = toSmallMap( copy );
100+
}
101+
}
102+
95103
public synchronized void registerNamedQueryDefinition(String name, NamedQueryDefinition definition) {
96104
if ( NamedSQLQueryDefinition.class.isInstance( definition ) ) {
97105
throw new IllegalArgumentException( "NamedSQLQueryDefinition instance incorrectly passed to registerNamedQueryDefinition" );
@@ -112,6 +120,15 @@ public synchronized void registerNamedQueryDefinition(String name, NamedQueryDef
112120
}
113121

114122
this.namedQueryDefinitionMap = toSmallMap( copy );
123+
removeNamedSQLQueryDefinition( name );
124+
}
125+
126+
private synchronized void removeNamedSQLQueryDefinition(String name) {
127+
if ( this.namedSqlQueryDefinitionMap.containsKey( name ) ) {
128+
final Map<String, NamedSQLQueryDefinition> copy = CollectionHelper.makeCopy( namedSqlQueryDefinitionMap );
129+
copy.remove( name );
130+
this.namedSqlQueryDefinitionMap = toSmallMap( copy );
131+
}
115132
}
116133

117134
public synchronized void registerNamedSQLQueryDefinition(String name, NamedSQLQueryDefinition definition) {
@@ -130,6 +147,7 @@ public synchronized void registerNamedSQLQueryDefinition(String name, NamedSQLQu
130147
}
131148

132149
this.namedSqlQueryDefinitionMap = toSmallMap( copy );
150+
removeNamedQueryDefinition( name );
133151
}
134152

135153
public synchronized void registerNamedProcedureCallMemento(String name, ProcedureCallMemento memento) {

hibernate-core/src/test/java/org/hibernate/jpa/test/query/AddNamedQueryTest.java

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,41 @@ public void basicTest() {
5454
em.close();
5555
}
5656

57+
@Test
58+
public void replaceTest() {
59+
EntityManager em = getOrCreateEntityManager();
60+
final String name = "myReplaceItemQuery";
61+
62+
// create a jpql query
63+
String sql = "from Item";
64+
Query query = em.createQuery( sql );
65+
query.setHint( "org.hibernate.comment", sql );
66+
em.getEntityManagerFactory().addNamedQuery( name, query );
67+
query = em.createNamedQuery( name );
68+
assertEquals( sql, query.getHints().get( "org.hibernate.comment" ) );
69+
assertEquals( 0, query.getResultList().size() );
70+
71+
// create a native query and replace the previous jpql
72+
sql = "select * from Item";
73+
query = em.createNativeQuery( sql, Item.class );
74+
query.setHint( "org.hibernate.comment", sql );
75+
em.getEntityManagerFactory().addNamedQuery( name, query );
76+
query = em.createNamedQuery( name );
77+
assertEquals( sql, query.getHints().get( "org.hibernate.comment" ) );
78+
assertEquals( 0, query.getResultList().size() );
79+
80+
// define back a named query
81+
sql = "from Item";
82+
query = em.createQuery( sql );
83+
query.setHint( "org.hibernate.comment", sql );
84+
em.getEntityManagerFactory().addNamedQuery( name, query );
85+
query = em.createNamedQuery( name );
86+
assertEquals( sql, query.getHints().get( "org.hibernate.comment" ) );
87+
assertEquals( 0, query.getResultList().size() );
88+
89+
em.close();
90+
}
91+
5792
@Test
5893
public void testLockModeHandling() {
5994
final String name = "lock-mode-handling";

0 commit comments

Comments
 (0)