5151import org .hibernate .query .criteria .JpaCriteriaQuery ;
5252import org .hibernate .query .criteria .JpaRoot ;
5353import org .hibernate .query .hql .spi .SqmQueryImplementor ;
54- import org .hibernate .query .named .NamedResultSetMappingMemento ;
5554import org .hibernate .query .spi .HqlInterpretation ;
5655import org .hibernate .query .spi .QueryImplementor ;
57- import org .hibernate .query .sql .internal .NativeQueryImpl ;
5856import org .hibernate .query .sql .spi .NativeQueryImplementor ;
5957import org .hibernate .query .sqm .internal .SqmUtil ;
6058import org .hibernate .query .sqm .tree .SqmStatement ;
@@ -372,12 +370,18 @@ private void firePostInsert(Object entity, Object id, Object[] state, EntityPers
372370
373371 private CompletionStage <?> generateId (EntityPersister persister , Object entity , Generator generator ) {
374372 if ( generator .generatesOnInsert () ) {
375- return generator instanceof ReactiveIdentifierGenerator
376- ? ( (ReactiveIdentifierGenerator <?>) generator ).generate ( this , this )
377- : completedFuture ( ( (BeforeExecutionGenerator ) generator ).generate ( this , entity , null , INSERT ) );
378- }
373+ if ( generator instanceof ReactiveIdentifierGenerator <?> reactiveGenerator ) {
374+ return reactiveGenerator .generate (this , this );
375+ }
376+ else if ( generator instanceof BeforeExecutionGenerator beforeExecutionGenerator ) {
377+ return completedFuture ( beforeExecutionGenerator .generate (this , entity , null , INSERT ) );
378+ }
379+ else {
380+ throw new IllegalArgumentException ( "Unsupported generator type: " + generator .getClass ().getName () );
381+ }
382+ }
379383 else {
380- Object id = persister .getIdentifier ( entity , this );
384+ final Object id = persister .getIdentifier ( entity , this );
381385 if ( id == null ) {
382386 throw new IdentifierGenerationException ( "Identifier of entity '" + persister .getEntityName () + "' must be manually assigned before calling 'insert()'" );
383387 }
@@ -878,8 +882,7 @@ public <R> ReactiveNativeQueryImplementor<R> createReactiveNativeQuery(String sq
878882 delayedAfterCompletion ();
879883
880884 try {
881- ReactiveNativeQueryImpl <R > query = new ReactiveNativeQueryImpl <>( sqlString , this );
882-
885+ final ReactiveNativeQueryImpl <R > query = new ReactiveNativeQueryImpl <>( sqlString , this );
883886 if ( isEmpty ( query .getComment () ) ) {
884887 query .setComment ( "dynamic native SQL query" );
885888 }
@@ -893,17 +896,18 @@ public <R> ReactiveNativeQueryImplementor<R> createReactiveNativeQuery(String sq
893896
894897 @ Override
895898 public <R > ReactiveNativeQuery <R > createReactiveNativeQuery (String sqlString , Class <R > resultClass ) {
896- ReactiveNativeQuery <R > query = createReactiveNativeQuery ( sqlString );
897- if ( Tuple .class .equals ( resultClass ) ) {
898- query .setTupleTransformer ( new NativeQueryTupleTransformer () );
899- }
900- else if ( getFactory ().getMappingMetamodel ().isEntityClass ( resultClass ) ) {
899+ final ReactiveNativeQuery <R > query = createReactiveNativeQuery ( sqlString );
900+ addEntityOrResultType ( resultClass , query );
901+ return query ;
902+ }
903+
904+ private <R > void addEntityOrResultType (Class <R > resultClass , ReactiveNativeQuery <R > query ) {
905+ if ( getFactory ().getMappingMetamodel ().isEntityClass ( resultClass ) ) {
901906 query .addEntity ( "alias1" , resultClass .getName (), LockMode .READ );
902907 }
903- else {
904- ( ( NativeQueryImpl <?>) query ). addScalar ( 1 , resultClass );
908+ else if ( resultClass != Object . class && resultClass != Object []. class ) {
909+ query . addResultTypeClass ( resultClass );
905910 }
906- return query ;
907911 }
908912
909913 @ Override
@@ -912,12 +916,13 @@ public <R> ReactiveNativeQuery<R> createReactiveNativeQuery(
912916 Class <R > resultClass ,
913917 String tableAlias ) {
914918 final ReactiveNativeQuery <R > query = createReactiveNativeQuery ( sqlString );
915- if ( getFactory ().getMappingMetamodel ().isEntityClass (resultClass ) ) {
919+ if ( getFactory ().getMappingMetamodel ().isEntityClass ( resultClass ) ) {
916920 query .addEntity ( tableAlias , resultClass .getName (), LockMode .READ );
917921 return query ;
918922 }
919-
920- throw new UnknownEntityTypeException ( "unable to locate persister: " + resultClass .getName () );
923+ else {
924+ throw new UnknownEntityTypeException ( "unable to locate persister: " + resultClass .getName () );
925+ }
921926 }
922927
923928 @ Override
@@ -927,19 +932,9 @@ public <R> ReactiveNativeQuery<R> createReactiveNativeQuery(String sqlString, St
927932 delayedAfterCompletion ();
928933
929934 try {
930- if ( isNotEmpty ( resultSetMappingName ) ) {
931- final NamedResultSetMappingMemento resultSetMappingMemento = getFactory ().getQueryEngine ()
932- .getNamedObjectRepository ()
933- .getResultSetMappingMemento ( resultSetMappingName );
934-
935- if ( resultSetMappingMemento == null ) {
936- throw new HibernateException ( "Could not resolve specified result-set mapping name : " + resultSetMappingName );
937- }
938- return new ReactiveNativeQueryImpl <>( sqlString , resultSetMappingMemento , this );
939- }
940- else {
941- return new ReactiveNativeQueryImpl <>( sqlString , this );
942- }
935+ return isNotEmpty ( resultSetMappingName )
936+ ? new ReactiveNativeQueryImpl <>( sqlString , getResultSetMappingMemento ( resultSetMappingName ), this )
937+ : new ReactiveNativeQueryImpl <>( sqlString , this );
943938 //TODO: why no applyQuerySettingsAndHints( query ); ???
944939 }
945940 catch (RuntimeException he ) {
@@ -954,7 +949,7 @@ public <R> ReactiveNativeQuery<R> createReactiveNativeQuery(
954949 Class <R > resultClass ) {
955950 final ReactiveNativeQuery <R > query = createReactiveNativeQuery ( sqlString , resultSetMappingName );
956951 if ( Tuple .class .equals ( resultClass ) ) {
957- query .setTupleTransformer ( new NativeQueryTupleTransformer () );
952+ query .setTupleTransformer ( NativeQueryTupleTransformer . INSTANCE );
958953 }
959954 return query ;
960955 }
@@ -1097,20 +1092,7 @@ public <R> ReactiveNativeQuery<R> createReactiveNativeQuery(
10971092 Class <R > resultType ,
10981093 AffectedEntities affectedEntities ) {
10991094 final ReactiveNativeQuery <R > query = createReactiveNativeQuery ( queryString , affectedEntities );
1100- return addResultType ( resultType , query );
1101- }
1102-
1103- //TODO: copy/paste from ORM, change visibility
1104- private <T > ReactiveNativeQuery <T > addResultType (Class <T > resultClass , ReactiveNativeQuery <T > query ) {
1105- if ( Tuple .class .equals ( resultClass ) ) {
1106- query .setTupleTransformer ( new NativeQueryTupleTransformer () );
1107- }
1108- else if ( getFactory ().getMappingMetamodel ().isEntityClass ( resultClass ) ) {
1109- query .addEntity ( "alias1" , resultClass .getName (), LockMode .READ );
1110- }
1111- else if ( resultClass != Object .class && resultClass != Object [].class ) {
1112- query .addScalar ( 1 , resultClass );
1113- }
1095+ addEntityOrResultType ( resultType , query );
11141096 return query ;
11151097 }
11161098
0 commit comments