diff --git a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/event/impl/AbstractReactiveSaveEventListener.java b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/event/impl/AbstractReactiveSaveEventListener.java index 2bed60008..6ca8a8ec2 100644 --- a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/event/impl/AbstractReactiveSaveEventListener.java +++ b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/event/impl/AbstractReactiveSaveEventListener.java @@ -180,23 +180,21 @@ private CompletionStage generateId( EventSource source, ReactiveIdentifierGenerator generator, EntityPersister persister) { - return generator - .generate( (ReactiveConnectionSupplier) source, entity ) + return generator.generate( (ReactiveConnectionSupplier) source, entity ) .thenApply( id -> { - final Object generatedId = castToIdentifierType( id, persister ); - if ( generatedId == null ) { - throw new IdentifierGenerationException( "null id generated for: " + entity.getClass() ); - } - if ( LOG.isDebugEnabled() ) { - LOG.debugf( - "Generated identifier: %s, using strategy: %s", - persister.getIdentifierType().toLoggableString( generatedId, source.getFactory() ), - generator.getClass().getName() - ); - } - return generatedId; - } - ); + final Object generatedId = castToIdentifierType( id, persister ); + if ( generatedId == null ) { + throw new IdentifierGenerationException( "null id generated for: " + entity.getClass() ); + } + if ( LOG.isDebugEnabled() ) { + LOG.debugf( + "Generated identifier: %s, using strategy: %s", + persister.getIdentifierType().toLoggableString( generatedId, source.getFactory() ), + generator.getClass().getName() + ); + } + return generatedId; + } ); } /** diff --git a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/session/ReactiveQueryProducer.java b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/session/ReactiveQueryProducer.java index 9b720b5a8..25a7402ef 100644 --- a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/session/ReactiveQueryProducer.java +++ b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/session/ReactiveQueryProducer.java @@ -63,10 +63,13 @@ public interface ReactiveQueryProducer extends ReactiveConnectionSupplier { ReactiveNativeQuery createReactiveNativeQuery(String sqlString, Class resultClass); + @Deprecated(forRemoval = true) ReactiveNativeQuery createReactiveNativeQuery(String sqlString, Class resultClass, String tableAlias); + @Deprecated(forRemoval = true) ReactiveNativeQuery createReactiveNativeQuery(String sqlString, String resultSetMappingName); + @Deprecated(forRemoval = true) ReactiveNativeQuery createReactiveNativeQuery(String sqlString, String resultSetMappingName, Class resultClass); ReactiveSelectionQuery createReactiveSelectionQuery(String hqlString, Class resultType); 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..fc8ee8ae6 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,23 +415,21 @@ public void prepareForQueryExecution(boolean requiresTxn) { @Override public ReactiveNativeQuery createReactiveNativeQuery(String sqlString, Class resultClass) { final ReactiveNativeQuery query = createReactiveNativeQuery( sqlString ); - return addResultType( resultClass, query ); + handleTupleResultType( resultClass, query ); + addEntityOrResultType( resultClass, query ); + return query; } - private ReactiveNativeQuery addResultType(Class resultClass, ReactiveNativeQuery query) { - if ( Tuple.class.equals( resultClass ) ) { - query.setTupleTransformer( new NativeQueryTupleTransformer() ); - } - else if ( getFactory().getMappingMetamodel().isEntityClass( resultClass ) ) { + private void addEntityOrResultType(Class resultClass, ReactiveNativeQuery query) { + if ( getFactory().getMappingMetamodel().isEntityClass( resultClass ) ) { query.addEntity( "alias1", resultClass.getName(), LockMode.READ ); } - else if ( resultClass != Object.class && resultClass != Object[].class ) { + else if ( resultClass != Object.class && resultClass != Object[].class && resultClass != Tuple.class ) { query.addResultTypeClass( resultClass ); } - return query; } - @Override + @Override @Deprecated(forRemoval = true) public ReactiveNativeQuery createReactiveNativeQuery(String sqlString, Class resultClass, String tableAlias) { final ReactiveNativeQuery query = createReactiveNativeQuery( sqlString ); if ( getFactory().getMappingMetamodel().isEntityClass( resultClass ) ) { @@ -443,7 +441,7 @@ public ReactiveNativeQuery createReactiveNativeQuery(String sqlString, Cl } } - @Override + @Override @Deprecated(forRemoval = true) public ReactiveNativeQuery createReactiveNativeQuery(String sqlString, String resultSetMappingName) { checkOpen(); pulseTransactionCoordinator(); @@ -460,12 +458,10 @@ public ReactiveNativeQuery createReactiveNativeQuery(String sqlString, St } } - @Override + @Override @Deprecated(forRemoval = true) public ReactiveNativeQuery createReactiveNativeQuery(String sqlString, String resultSetMappingName, Class resultClass) { final ReactiveNativeQuery query = createReactiveNativeQuery( sqlString, resultSetMappingName ); - if ( Tuple.class.equals( resultClass ) ) { - query.setTupleTransformer( new NativeQueryTupleTransformer() ); - } + handleTupleResultType( resultClass, query ); return query; } @@ -610,7 +606,15 @@ 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 ); + handleTupleResultType( resultType, query ); + addEntityOrResultType( resultType, query ); + return query; + } + + private static void handleTupleResultType(Class resultType, ReactiveNativeQuery query) { + if ( Tuple.class.equals(resultType) ) { + query.setTupleTransformer( NativeQueryTupleTransformer.INSTANCE ); + } } @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..8e8e338a6 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; @@ -372,12 +370,18 @@ private void firePostInsert(Object entity, Object id, Object[] state, EntityPers private CompletionStage generateId(EntityPersister persister, Object entity, Generator generator) { if ( generator.generatesOnInsert() ) { - return generator instanceof ReactiveIdentifierGenerator - ? ( (ReactiveIdentifierGenerator) generator ).generate( this, this ) - : completedFuture( ( (BeforeExecutionGenerator) generator ).generate( this, entity, null, INSERT ) ); - } + if ( generator instanceof ReactiveIdentifierGenerator reactiveGenerator ) { + return reactiveGenerator.generate(this, this); + } + else if ( generator instanceof BeforeExecutionGenerator beforeExecutionGenerator ) { + return completedFuture( beforeExecutionGenerator.generate(this, entity, null, INSERT) ); + } + else { + throw new IllegalArgumentException( "Unsupported generator type: " + generator.getClass().getName() ); + } + } else { - Object id = persister.getIdentifier( entity, this ); + final Object id = persister.getIdentifier( entity, this ); if ( id == null ) { throw new IdentifierGenerationException( "Identifier of entity '" + persister.getEntityName() + "' must be manually assigned before calling 'insert()'" ); } @@ -878,8 +882,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,53 +896,46 @@ public ReactiveNativeQueryImplementor createReactiveNativeQuery(String sq @Override public ReactiveNativeQuery createReactiveNativeQuery(String sqlString, Class resultClass) { - ReactiveNativeQuery query = createReactiveNativeQuery( sqlString ); - if ( Tuple.class.equals( resultClass ) ) { - query.setTupleTransformer( new NativeQueryTupleTransformer() ); - } - else if ( getFactory().getMappingMetamodel().isEntityClass( resultClass ) ) { + final ReactiveNativeQuery query = createReactiveNativeQuery( sqlString ); + handleTupleResultType( resultClass, query ); + addEntityOrResultType( resultClass, query ); + return query; + } + + private void addEntityOrResultType(Class resultClass, ReactiveNativeQuery query) { + 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 && resultClass != Tuple.class ) { + query.addResultTypeClass( resultClass ); } - return query; } - @Override + @Override @Deprecated(forRemoval = true) public ReactiveNativeQuery createReactiveNativeQuery( String sqlString, 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 + @Override @Deprecated(forRemoval = true) public ReactiveNativeQuery createReactiveNativeQuery(String sqlString, String resultSetMappingName) { checkOpen(); pulseTransactionCoordinator(); 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) { @@ -947,15 +943,13 @@ public ReactiveNativeQuery createReactiveNativeQuery(String sqlString, St } } - @Override + @Override @Deprecated(forRemoval = true) public ReactiveNativeQuery createReactiveNativeQuery( String sqlString, String resultSetMappingName, Class resultClass) { final ReactiveNativeQuery query = createReactiveNativeQuery( sqlString, resultSetMappingName ); - if ( Tuple.class.equals( resultClass ) ) { - query.setTupleTransformer( new NativeQueryTupleTransformer() ); - } + handleTupleResultType( resultClass, query ); return query; } @@ -1097,21 +1091,15 @@ public ReactiveNativeQuery createReactiveNativeQuery( Class resultType, AffectedEntities affectedEntities) { final ReactiveNativeQuery query = createReactiveNativeQuery( queryString, affectedEntities ); - return addResultType( resultType, query ); + handleTupleResultType( resultType, query ); + addEntityOrResultType( resultType, query ); + return query; } - //TODO: copy/paste from ORM, change visibility - private ReactiveNativeQuery addResultType(Class resultClass, ReactiveNativeQuery query) { - if ( Tuple.class.equals( resultClass ) ) { - query.setTupleTransformer( new NativeQueryTupleTransformer() ); + private static void handleTupleResultType(Class resultType, ReactiveNativeQuery query) { + if ( Tuple.class.equals(resultType) ) { + query.setTupleTransformer( NativeQueryTupleTransformer.INSTANCE ); } - 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 ); - } - return query; } @Override