Skip to content

Commit a11ea01

Browse files
gavinkingDavideD
authored andcommitted
fix #919 native queries returning Tuple
1 parent b828388 commit a11ea01

File tree

7 files changed

+31
-40
lines changed

7 files changed

+31
-40
lines changed

hibernate-reactive-core/src/main/java/org/hibernate/reactive/mutiny/impl/MutinySessionImpl.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -207,11 +207,7 @@ public <R> Mutiny.Query<R> createNativeQuery(String sql) {
207207

208208
@Override
209209
public <R> Mutiny.Query<R> createNativeQuery(String sql, Class<R> resultType) {
210-
boolean knownType = delegate.getFactory().getMetamodel()
211-
.entityPersisters().containsKey( resultType.getName() );
212-
return knownType
213-
? new MutinyQueryImpl<>( delegate.createReactiveNativeQuery(sql, resultType), factory )
214-
: new MutinyQueryImpl<>( delegate.createReactiveNativeQuery(sql), factory );
210+
return new MutinyQueryImpl<>( delegate.createReactiveNativeQuery(sql, resultType), factory );
215211
}
216212

217213
@Override

hibernate-reactive-core/src/main/java/org/hibernate/reactive/mutiny/impl/MutinyStatelessSessionImpl.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -74,11 +74,7 @@ public <R> Mutiny.Query<R> createNativeQuery(String queryString) {
7474

7575
@Override
7676
public <R> Mutiny.Query<R> createNativeQuery(String queryString, Class<R> resultType) {
77-
boolean knownType = delegate.getFactory().getMetamodel()
78-
.entityPersisters().containsKey( resultType.getName() );
79-
return knownType
80-
? new MutinyQueryImpl<>( delegate.createReactiveNativeQuery(queryString, resultType), factory )
81-
: new MutinyQueryImpl<>( delegate.createReactiveNativeQuery(queryString), factory );
77+
return new MutinyQueryImpl<>( delegate.createReactiveNativeQuery(queryString, resultType), factory );
8278
}
8379

8480
@Override

hibernate-reactive-core/src/main/java/org/hibernate/reactive/session/impl/ReactiveSessionImpl.java

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -316,23 +316,19 @@ public <T> ResultSetMapping<T> getResultSetMapping(Class<T> resultType, String m
316316
public <T> ReactiveQuery<T> createReactiveNativeQuery(String sqlString, Class<T> resultClass) {
317317
try {
318318
ReactiveNativeQuery<T> query = createReactiveNativeQuery( sqlString );
319-
handleNativeQueryResult( query, resultClass );
319+
if ( getMetamodel().entityPersisters().containsKey( resultClass.getName() ) ) {
320+
query.addEntity( "alias1", resultClass.getName(), LockMode.READ );
321+
}
322+
else if ( Tuple.class.equals(resultClass) ) {
323+
query.setResultTransformer( new NativeQueryTupleTransformer() );
324+
}
320325
return query;
321326
}
322327
catch ( RuntimeException he ) {
323328
throw getExceptionConverter().convert( he );
324329
}
325330
}
326331

327-
private <T> void handleNativeQueryResult(ReactiveNativeQuery<T> query, Class<T> resultClass) {
328-
if ( Tuple.class.equals( resultClass ) ) {
329-
query.setResultTransformer( new NativeQueryTupleTransformer() );
330-
}
331-
else {
332-
query.addEntity( "alias1", resultClass.getName(), LockMode.READ );
333-
}
334-
}
335-
336332
@Override
337333
public <R> ReactiveQueryImpl<R> createReactiveQuery(String queryString) {
338334
checkOpen();

hibernate-reactive-core/src/main/java/org/hibernate/reactive/session/impl/ReactiveStatelessSessionImpl.java

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import org.hibernate.jpa.spi.NativeQueryTupleTransformer;
3434
import org.hibernate.loader.custom.CustomQuery;
3535
import org.hibernate.loader.custom.sql.SQLCustomQuery;
36+
import org.hibernate.metamodel.spi.MetamodelImplementor;
3637
import org.hibernate.persister.entity.EntityPersister;
3738
import org.hibernate.proxy.HibernateProxy;
3839
import org.hibernate.proxy.LazyInitializer;
@@ -343,15 +344,6 @@ public <R> ReactiveQuery<R> createReactiveQuery(String queryString, Class<R> res
343344
}
344345
}
345346

346-
private <T> void handleNativeQueryResult(ReactiveNativeQuery<T> query, Class<T> resultClass) {
347-
if ( Tuple.class.equals( resultClass ) ) {
348-
query.setResultTransformer( new NativeQueryTupleTransformer() );
349-
}
350-
else {
351-
query.addEntity( "alias1", resultClass.getName(), LockMode.READ );
352-
}
353-
}
354-
355347
@Override
356348
public <R> ReactiveQuery<R> createReactiveNamedQuery(String name) {
357349
return buildReactiveQueryFromName( name, null );
@@ -468,11 +460,21 @@ public <T> ReactiveNativeQuery<T> createReactiveNativeQuery(String sqlString) {
468460
}
469461
}
470462

463+
public MetamodelImplementor getMetamodel() {
464+
checkOpen();
465+
return getFactory().getMetamodel();
466+
}
467+
471468
@Override
472469
public <T> ReactiveNativeQuery<T> createReactiveNativeQuery(String sqlString, Class<T> resultClass) {
473470
try {
474471
ReactiveNativeQuery<T> query = createReactiveNativeQuery( sqlString );
475-
handleNativeQueryResult( query, resultClass );
472+
if ( getMetamodel().entityPersisters().containsKey( resultClass.getName() ) ) {
473+
query.addEntity( "alias1", resultClass.getName(), LockMode.READ );
474+
}
475+
else if ( Tuple.class.equals(resultClass) ) {
476+
query.setResultTransformer( new NativeQueryTupleTransformer() );
477+
}
476478
return query;
477479
}
478480
catch ( RuntimeException he ) {

hibernate-reactive-core/src/main/java/org/hibernate/reactive/stage/impl/StageSessionImpl.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -206,11 +206,7 @@ public <R> Stage.Query<R> createNativeQuery(String sql) {
206206

207207
@Override
208208
public <R> Stage.Query<R> createNativeQuery(String sql, Class<R> resultType) {
209-
boolean knownType = delegate.getFactory().getMetamodel()
210-
.entityPersisters().containsKey( resultType.getName() );
211-
return knownType
212-
? new StageQueryImpl<>( delegate.createReactiveNativeQuery(sql, resultType), factory )
213-
: new StageQueryImpl<>( delegate.createReactiveNativeQuery(sql), factory );
209+
return new StageQueryImpl<>( delegate.createReactiveNativeQuery(sql, resultType), factory );
214210
}
215211

216212
@Override

hibernate-reactive-core/src/main/java/org/hibernate/reactive/stage/impl/StageStatelessSessionImpl.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -75,11 +75,7 @@ public <R> Stage.Query<R> createNativeQuery(String queryString) {
7575

7676
@Override
7777
public <R> Stage.Query<R> createNativeQuery(String queryString, Class<R> resultType) {
78-
boolean knownType = delegate.getFactory().getMetamodel()
79-
.entityPersisters().containsKey( resultType.getName() );
80-
return knownType
81-
? new StageQueryImpl<>( delegate.createReactiveNativeQuery(queryString, resultType), factory )
82-
: new StageQueryImpl<>( delegate.createReactiveNativeQuery(queryString), factory );
78+
return new StageQueryImpl<>( delegate.createReactiveNativeQuery(queryString, resultType), factory );
8379
}
8480

8581
@Override

hibernate-reactive-core/src/test/java/org/hibernate/reactive/QueryTest.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -427,6 +427,15 @@ public void testNativeProjectionQuery(TestContext context) {
427427
context.assertTrue( tuple[0] instanceof String );
428428
} )
429429
)
430+
.thenCompose( vv -> session.createNativeQuery("select title, isbn, id from books", Tuple.class )
431+
.getResultList()
432+
.thenAccept( list -> {
433+
Tuple tuple = list.get(0);
434+
context.assertEquals( 3, tuple.toArray().length );
435+
context.assertTrue( tuple.get(0) instanceof String );
436+
context.assertTrue( tuple.get("isbn") instanceof String );
437+
} )
438+
)
430439
)
431440
);
432441
}

0 commit comments

Comments
 (0)