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,69 +896,60 @@ 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+ handleTupleResultType ( resultClass , query );
901+ addEntityOrResultType ( resultClass , query );
902+ return query ;
903+ }
904+
905+ private <R > void addEntityOrResultType (Class <R > resultClass , ReactiveNativeQuery <R > query ) {
906+ if ( getFactory ().getMappingMetamodel ().isEntityClass ( resultClass ) ) {
901907 query .addEntity ( "alias1" , resultClass .getName (), LockMode .READ );
902908 }
903- else {
904- ( ( NativeQueryImpl <?>) query ). addScalar ( 1 , resultClass );
909+ else if ( resultClass != Object . class && resultClass != Object []. class && resultClass != Tuple . class ) {
910+ query . addResultTypeClass ( resultClass );
905911 }
906- return query ;
907912 }
908913
909- @ Override
914+ @ Override @ Deprecated ( forRemoval = true )
910915 public <R > ReactiveNativeQuery <R > createReactiveNativeQuery (
911916 String sqlString ,
912917 Class <R > resultClass ,
913918 String tableAlias ) {
914919 final ReactiveNativeQuery <R > query = createReactiveNativeQuery ( sqlString );
915- if ( getFactory ().getMappingMetamodel ().isEntityClass (resultClass ) ) {
920+ if ( getFactory ().getMappingMetamodel ().isEntityClass ( resultClass ) ) {
916921 query .addEntity ( tableAlias , resultClass .getName (), LockMode .READ );
917922 return query ;
918923 }
919-
920- throw new UnknownEntityTypeException ( "unable to locate persister: " + resultClass .getName () );
924+ else {
925+ throw new UnknownEntityTypeException ( "unable to locate persister: " + resultClass .getName () );
926+ }
921927 }
922928
923- @ Override
929+ @ Override @ Deprecated ( forRemoval = true )
924930 public <R > ReactiveNativeQuery <R > createReactiveNativeQuery (String sqlString , String resultSetMappingName ) {
925931 checkOpen ();
926932 pulseTransactionCoordinator ();
927933 delayedAfterCompletion ();
928934
929935 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- }
936+ return isNotEmpty ( resultSetMappingName )
937+ ? new ReactiveNativeQueryImpl <>( sqlString , getResultSetMappingMemento ( resultSetMappingName ), this )
938+ : new ReactiveNativeQueryImpl <>( sqlString , this );
943939 //TODO: why no applyQuerySettingsAndHints( query ); ???
944940 }
945941 catch (RuntimeException he ) {
946942 throw getExceptionConverter ().convert ( he );
947943 }
948944 }
949945
950- @ Override
946+ @ Override @ Deprecated ( forRemoval = true )
951947 public <R > ReactiveNativeQuery <R > createReactiveNativeQuery (
952948 String sqlString ,
953949 String resultSetMappingName ,
954950 Class <R > resultClass ) {
955951 final ReactiveNativeQuery <R > query = createReactiveNativeQuery ( sqlString , resultSetMappingName );
956- if ( Tuple .class .equals ( resultClass ) ) {
957- query .setTupleTransformer ( new NativeQueryTupleTransformer () );
958- }
952+ handleTupleResultType ( resultClass , query );
959953 return query ;
960954 }
961955
@@ -1097,21 +1091,15 @@ public <R> ReactiveNativeQuery<R> createReactiveNativeQuery(
10971091 Class <R > resultType ,
10981092 AffectedEntities affectedEntities ) {
10991093 final ReactiveNativeQuery <R > query = createReactiveNativeQuery ( queryString , affectedEntities );
1100- return addResultType ( resultType , query );
1094+ handleTupleResultType ( resultType , query );
1095+ addEntityOrResultType ( resultType , query );
1096+ return query ;
11011097 }
11021098
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 () );
1099+ private static <R > void handleTupleResultType (Class <R > resultType , ReactiveNativeQuery <R > query ) {
1100+ if ( Tuple .class .equals (resultType ) ) {
1101+ query .setTupleTransformer ( NativeQueryTupleTransformer .INSTANCE );
11071102 }
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- }
1114- return query ;
11151103 }
11161104
11171105 @ Override
0 commit comments