diff --git a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/session/impl/ReactiveSessionImpl.java b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/session/impl/ReactiveSessionImpl.java index 9f5ca8c95..e42547f9d 100644 --- a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/session/impl/ReactiveSessionImpl.java +++ b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/session/impl/ReactiveSessionImpl.java @@ -415,20 +415,27 @@ public void prepareForQueryExecution(boolean requiresTxn) { @Override public ReactiveNativeQuery createReactiveNativeQuery(String sqlString, Class resultClass) { final ReactiveNativeQuery query = createReactiveNativeQuery( sqlString ); - return addResultType( resultClass, query ); + setTupleTransformerForResultType( resultClass, query ); + return query; } - private ReactiveNativeQuery addResultType(Class resultClass, ReactiveNativeQuery query) { + // see AbstractSharedSessionContract.setTupleTransformerForResultType + private void setTupleTransformerForResultType(Class resultClass, ReactiveNativeQuery query) { if ( Tuple.class.equals( resultClass ) ) { - query.setTupleTransformer( new NativeQueryTupleTransformer() ); + query.setTupleTransformer( NativeQueryTupleTransformer.INSTANCE ); } +// else if ( Map.class.equals( resultClass ) ) { +// query.setTupleTransformer( NativeQueryMapTransformer.INSTANCE ); +// } +// else if ( List.class.equals( resultClass ) ) { +// query.setTupleTransformer( NativeQueryListTransformer.INSTANCE ); +// } else if ( getFactory().getMappingMetamodel().isEntityClass( resultClass ) ) { query.addEntity( "alias1", resultClass.getName(), LockMode.READ ); } else if ( resultClass != Object.class && resultClass != Object[].class ) { query.addResultTypeClass( resultClass ); } - return query; } @Override @@ -610,7 +617,8 @@ private void addAffectedEntities(AffectedEntities affectedEntities, NativeQueryI @Override public ReactiveNativeQuery createReactiveNativeQuery(String queryString, Class resultType, AffectedEntities affectedEntities) { final ReactiveNativeQuery query = createReactiveNativeQuery( queryString, affectedEntities ); - return addResultType( resultType, query ); + setTupleTransformerForResultType( resultType, query ); + return query; } @Override diff --git a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/session/impl/ReactiveStatelessSessionImpl.java b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/session/impl/ReactiveStatelessSessionImpl.java index bc588dae8..ae167d278 100644 --- a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/session/impl/ReactiveStatelessSessionImpl.java +++ b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/session/impl/ReactiveStatelessSessionImpl.java @@ -51,10 +51,8 @@ import org.hibernate.query.criteria.JpaCriteriaQuery; import org.hibernate.query.criteria.JpaRoot; import org.hibernate.query.hql.spi.SqmQueryImplementor; -import org.hibernate.query.named.NamedResultSetMappingMemento; import org.hibernate.query.spi.HqlInterpretation; import org.hibernate.query.spi.QueryImplementor; -import org.hibernate.query.sql.internal.NativeQueryImpl; import org.hibernate.query.sql.spi.NativeQueryImplementor; import org.hibernate.query.sqm.internal.SqmUtil; import org.hibernate.query.sqm.tree.SqmStatement; @@ -878,8 +876,7 @@ public ReactiveNativeQueryImplementor createReactiveNativeQuery(String sq delayedAfterCompletion(); try { - ReactiveNativeQueryImpl query = new ReactiveNativeQueryImpl<>( sqlString, this); - + final ReactiveNativeQueryImpl query = new ReactiveNativeQueryImpl<>( sqlString, this ); if ( isEmpty( query.getComment() ) ) { query.setComment( "dynamic native SQL query" ); } @@ -893,17 +890,28 @@ public ReactiveNativeQueryImplementor createReactiveNativeQuery(String sq @Override public ReactiveNativeQuery createReactiveNativeQuery(String sqlString, Class resultClass) { - ReactiveNativeQuery query = createReactiveNativeQuery( sqlString ); + final ReactiveNativeQuery query = createReactiveNativeQuery( sqlString ); + setTupleTransformerForResultType( resultClass, query ); + return query; + } + + // see AbstractSharedSessionContract.setTupleTransformerForResultType + private void setTupleTransformerForResultType(Class resultClass, ReactiveNativeQuery query) { if ( Tuple.class.equals( resultClass ) ) { - query.setTupleTransformer( new NativeQueryTupleTransformer() ); + query.setTupleTransformer( NativeQueryTupleTransformer.INSTANCE ); } +// else if ( Map.class.equals( resultClass ) ) { +// query.setTupleTransformer( NativeQueryMapTransformer.INSTANCE ); +// } +// else if ( List.class.equals( resultClass ) ) { +// query.setTupleTransformer( NativeQueryListTransformer.INSTANCE ); +// } else if ( getFactory().getMappingMetamodel().isEntityClass( resultClass ) ) { query.addEntity( "alias1", resultClass.getName(), LockMode.READ ); } - else { - ( (NativeQueryImpl) query ).addScalar( 1, resultClass ); + else if ( resultClass != Object.class && resultClass != Object[].class ) { + query.addResultTypeClass( resultClass ); } - return query; } @Override @@ -912,12 +920,13 @@ public ReactiveNativeQuery createReactiveNativeQuery( Class resultClass, String tableAlias) { final ReactiveNativeQuery query = createReactiveNativeQuery( sqlString ); - if ( getFactory().getMappingMetamodel().isEntityClass(resultClass) ) { + if ( getFactory().getMappingMetamodel().isEntityClass( resultClass ) ) { query.addEntity( tableAlias, resultClass.getName(), LockMode.READ ); return query; } - - throw new UnknownEntityTypeException( "unable to locate persister: " + resultClass.getName() ); + else { + throw new UnknownEntityTypeException( "unable to locate persister: " + resultClass.getName() ); + } } @Override @@ -927,19 +936,9 @@ public ReactiveNativeQuery createReactiveNativeQuery(String sqlString, St delayedAfterCompletion(); try { - if ( isNotEmpty( resultSetMappingName ) ) { - final NamedResultSetMappingMemento resultSetMappingMemento = getFactory().getQueryEngine() - .getNamedObjectRepository() - .getResultSetMappingMemento( resultSetMappingName ); - - if ( resultSetMappingMemento == null ) { - throw new HibernateException( "Could not resolve specified result-set mapping name : " + resultSetMappingName ); - } - return new ReactiveNativeQueryImpl<>( sqlString, resultSetMappingMemento, this ); - } - else { - return new ReactiveNativeQueryImpl<>( sqlString, this ); - } + return isNotEmpty( resultSetMappingName ) + ? new ReactiveNativeQueryImpl<>( sqlString, getResultSetMappingMemento( resultSetMappingName ), this ) + : new ReactiveNativeQueryImpl<>( sqlString, this ); //TODO: why no applyQuerySettingsAndHints( query ); ??? } catch (RuntimeException he) { @@ -1097,20 +1096,7 @@ public ReactiveNativeQuery createReactiveNativeQuery( Class resultType, AffectedEntities affectedEntities) { final ReactiveNativeQuery query = createReactiveNativeQuery( queryString, affectedEntities ); - return addResultType( resultType, query ); - } - - //TODO: copy/paste from ORM, change visibility - private ReactiveNativeQuery addResultType(Class resultClass, ReactiveNativeQuery query) { - if ( Tuple.class.equals( resultClass ) ) { - query.setTupleTransformer( new NativeQueryTupleTransformer() ); - } - else if ( getFactory().getMappingMetamodel().isEntityClass( resultClass ) ) { - query.addEntity( "alias1", resultClass.getName(), LockMode.READ ); - } - else if ( resultClass != Object.class && resultClass != Object[].class ) { - query.addScalar( 1, resultClass ); - } + setTupleTransformerForResultType( resultType, query ); return query; }