Skip to content

Commit b387801

Browse files
gavinkingDavideD
authored andcommitted
fix #956 problem with getSingleResultOrNull()
1 parent 08879a1 commit b387801

File tree

4 files changed

+42
-11
lines changed

4 files changed

+42
-11
lines changed

hibernate-reactive-core/src/main/java/org/hibernate/reactive/session/ReactiveQuery.java

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020

2121
import javax.persistence.EntityGraph;
2222
import javax.persistence.NoResultException;
23-
import javax.persistence.NonUniqueResultException;
2423
import javax.persistence.Parameter;
2524
import java.util.List;
2625
import java.util.concurrent.CompletionStage;
@@ -43,16 +42,7 @@ public interface ReactiveQuery<R> {
4342

4443
CompletionStage<List<R>> getReactiveResultList();
4544

46-
default CompletionStage<R> getReactiveSingleResultOrNull() {
47-
return getReactiveResultList().thenApply( list -> {
48-
switch ( list.size() ) {
49-
case 0: return null;
50-
case 1: return list.get(0);
51-
default: throw new NonUniqueResultException(
52-
"query did not return a unique result: there were " + list.size() + "results" );
53-
}
54-
} );
55-
}
45+
CompletionStage<R> getReactiveSingleResultOrNull();
5646

5747
CompletionStage<Integer> executeReactiveUpdate();
5848

@@ -124,6 +114,19 @@ static <R> R extractUniqueResult(List<R> list, AbstractProducedQuery<R> query) {
124114
}
125115
}
126116

117+
static <R> R extractUniqueResultOrNull(List<R> list, AbstractProducedQuery<R> query) {
118+
try {
119+
if ( list.size() == 0 ) {
120+
return null;
121+
}
122+
return AbstractProducedQuery.uniqueElement( list );
123+
}
124+
catch (HibernateException e) {
125+
throw query.getProducer().getExceptionConverter()
126+
.convert( e, query.getLockOptions() );
127+
}
128+
}
129+
127130
void setPlan(EntityGraph<R> entityGraph);
128131

129132
ReactiveQuery<R> setCacheable(boolean cacheable);

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828

2929
import static org.hibernate.reactive.session.ReactiveQuery.convertQueryException;
3030
import static org.hibernate.reactive.session.ReactiveQuery.extractUniqueResult;
31+
import static org.hibernate.reactive.session.ReactiveQuery.extractUniqueResultOrNull;
3132

3233
/**
3334
* Implementation of {@link ReactiveNativeQuery} by extension of
@@ -80,6 +81,11 @@ public CompletionStage<R> getReactiveSingleResult() {
8081
return getReactiveResultList().thenApply( list -> extractUniqueResult( list, this ) );
8182
}
8283

84+
@Override
85+
public CompletionStage<R> getReactiveSingleResultOrNull() {
86+
return getReactiveResultList().thenApply( list -> extractUniqueResultOrNull( list, this ) );
87+
}
88+
8389
@Override
8490
public CompletionStage<Integer> executeReactiveUpdate() {
8591
getProducer().checkTransactionNeededForUpdateOperation( "Executing an update/delete query" );

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import static java.util.Collections.emptyMap;
3434
import static org.hibernate.reactive.session.ReactiveQuery.convertQueryException;
3535
import static org.hibernate.reactive.session.ReactiveQuery.extractUniqueResult;
36+
import static org.hibernate.reactive.session.ReactiveQuery.extractUniqueResultOrNull;
3637
import static org.hibernate.reactive.util.impl.CompletionStages.completedFuture;
3738

3839
/**
@@ -82,6 +83,14 @@ public CompletionStage<R> getReactiveSingleResult() {
8283
return getReactiveResultList().thenApply( list -> extractUniqueResult( list, this ) );
8384
}
8485

86+
@Override
87+
public CompletionStage<R> getReactiveSingleResultOrNull() {
88+
if ( type!=null && type!=QueryType.SELECT ) {
89+
throw new UnsupportedOperationException("not a select query");
90+
}
91+
return getReactiveResultList().thenApply( list -> extractUniqueResultOrNull( list, this ) );
92+
}
93+
8594
@Override
8695
public CompletionStage<Integer> executeReactiveUpdate() {
8796
if ( type!=null && type!=QueryType.INSERT_UPDATE_DELETE ) {

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,19 @@ public void test(TestContext context) {
5555
.invoke( a -> context.assertEquals( 2, a.books.size() ) )
5656
)
5757
)
58+
.chain( () -> getMutinySessionFactory()
59+
.withTransaction( (session, transaction) -> session.createQuery("select a from Author a left join fetch a.books", Author.class )
60+
.getSingleResultOrNull()
61+
.invoke( a -> context.assertTrue( Hibernate.isInitialized(a.books) ) )
62+
.invoke( a -> context.assertEquals( 2, a.books.size() ) )
63+
)
64+
)
65+
.chain( () -> getMutinySessionFactory()
66+
.withTransaction( (session, transaction) -> session.createQuery("select a from Author a left join fetch a.books where 1=0", Author.class )
67+
.getSingleResultOrNull()
68+
.invoke(context::assertNull)
69+
)
70+
)
5871
.chain( () -> getMutinySessionFactory()
5972
.withTransaction( (session, transaction) -> session.find(Author.class, author.id)
6073
.chain( a -> session.fetch(a.books) )

0 commit comments

Comments
 (0)