From c1bed9f578a3497797fd113b633559307209feea Mon Sep 17 00:00:00 2001 From: rob bygrave Date: Fri, 19 May 2017 23:38:24 +1200 Subject: [PATCH] #996 Add findOne() and findOneOrEmpty() --- src/main/java/io/ebean/EbeanServer.java | 20 +++++++++++++++++-- src/main/java/io/ebean/ExpressionList.java | 16 +++++++++++++++ src/main/java/io/ebean/Query.java | 16 +++++++++++++++ .../server/core/DefaultServer.java | 11 ++++++++++ .../expression/DefaultExpressionList.java | 11 ++++++++++ .../server/expression/JunctionExpression.java | 11 ++++++++++ .../server/querydefn/DefaultOrmQuery.java | 13 +++++++++++- 7 files changed, 95 insertions(+), 3 deletions(-) diff --git a/src/main/java/io/ebean/EbeanServer.java b/src/main/java/io/ebean/EbeanServer.java index 22cb020ba..68a956cd9 100644 --- a/src/main/java/io/ebean/EbeanServer.java +++ b/src/main/java/io/ebean/EbeanServer.java @@ -14,6 +14,7 @@ import javax.persistence.PersistenceException; import java.util.Collection; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.function.Consumer; import java.util.function.Predicate; @@ -1066,7 +1067,7 @@ public interface EbeanServer { * This will throw a NonUniqueResultException if the query finds more than one result. *

*

- * Generally you are able to use {@link Query#findUnique()} rather than + * Generally you are able to use {@link Query#findOne()} rather than * explicitly calling this method. You could use this method if you wish to * explicitly control the transaction used for the query. *

@@ -1076,7 +1077,22 @@ public interface EbeanServer { * @param transaction the transaction to use (can be null). * @return the list of fetched beans. * @throws NonUniqueResultException if more than one result was found - * @see Query#findUnique() + * @see Query#findOne() + */ + @Nullable + T findOne(Query query, Transaction transaction); + + /** + * Similar to findOne() but returns an Optional (rather than nullable). + */ + Optional findOneOrEmpty(Query query, Transaction transaction); + + /** + * Synonym for findOne(). + *

+ * This proceeded findOne which was introduced to better match spring data. + * This will be deprecated at some future point. + *

*/ @Nullable T findUnique(Query query, Transaction transaction); diff --git a/src/main/java/io/ebean/ExpressionList.java b/src/main/java/io/ebean/ExpressionList.java index 4b2ddfec4..24ab4bad9 100644 --- a/src/main/java/io/ebean/ExpressionList.java +++ b/src/main/java/io/ebean/ExpressionList.java @@ -12,6 +12,7 @@ import java.sql.Timestamp; import java.util.Collection; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.function.Consumer; import java.util.function.Predicate; @@ -266,6 +267,21 @@ public interface ExpressionList { * @see Query#findUnique() */ @Nullable + T findOne(); + + /** + * Execute the query returning an optional bean. + */ + Optional findOneOrEmpty(); + + /** + * Synonym for findOne(). + *

+ * This proceeded findOne which was introduced to better match spring data. + * This will be deprecated at some future point. + *

+ */ + @Nullable T findUnique(); /** diff --git a/src/main/java/io/ebean/Query.java b/src/main/java/io/ebean/Query.java index 2a1d5d3ea..b98da082d 100644 --- a/src/main/java/io/ebean/Query.java +++ b/src/main/java/io/ebean/Query.java @@ -6,6 +6,7 @@ import javax.persistence.NonUniqueResultException; import java.sql.Timestamp; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.function.Consumer; import java.util.function.Predicate; @@ -854,6 +855,21 @@ public interface Query { * @throws NonUniqueResultException if more than one result was found */ @Nullable + T findOne(); + + /** + * Execute the query returning an optional bean. + */ + Optional findOneOrEmpty(); + + /** + * Synonym for findOne(). + *

+ * This proceeded findOne which was introduced to better match spring data. + * This will be deprecated at some future point. + *

+ */ + @Nullable T findUnique(); /** diff --git a/src/main/java/io/ebeaninternal/server/core/DefaultServer.java b/src/main/java/io/ebeaninternal/server/core/DefaultServer.java index 4b9eb23bf..d70e76ac7 100644 --- a/src/main/java/io/ebeaninternal/server/core/DefaultServer.java +++ b/src/main/java/io/ebeaninternal/server/core/DefaultServer.java @@ -104,6 +104,7 @@ import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Consumer; @@ -1175,6 +1176,16 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer { @Override public T findUnique(Query query, Transaction transaction) { + return findOne(query, transaction); + } + + @Override + public Optional findOneOrEmpty(Query query, Transaction transaction) { + return Optional.ofNullable(findOne(query, transaction)); + } + + @Override + public T findOne(Query query, Transaction transaction) { SpiQuery spiQuery = (SpiQuery) query; spiQuery.checkIdEqualTo(); diff --git a/src/main/java/io/ebeaninternal/server/expression/DefaultExpressionList.java b/src/main/java/io/ebeaninternal/server/expression/DefaultExpressionList.java index d16e1a2b2..3d3d3432f 100644 --- a/src/main/java/io/ebeaninternal/server/expression/DefaultExpressionList.java +++ b/src/main/java/io/ebeaninternal/server/expression/DefaultExpressionList.java @@ -34,6 +34,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.function.Consumer; import java.util.function.Predicate; @@ -409,6 +410,16 @@ public class DefaultExpressionList implements SpiExpressionList { return query.findSingleAttributeList(); } + @Override + public T findOne() { + return query.findOne(); + } + + @Override + public Optional findOneOrEmpty() { + return query.findOneOrEmpty(); + } + @Override public T findUnique() { return query.findUnique(); diff --git a/src/main/java/io/ebeaninternal/server/expression/JunctionExpression.java b/src/main/java/io/ebeaninternal/server/expression/JunctionExpression.java index c44d6dbea..c4adbaf9c 100644 --- a/src/main/java/io/ebeaninternal/server/expression/JunctionExpression.java +++ b/src/main/java/io/ebeaninternal/server/expression/JunctionExpression.java @@ -31,6 +31,7 @@ import java.sql.Timestamp; import java.util.Collection; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.function.Consumer; import java.util.function.Predicate; @@ -414,6 +415,16 @@ class JunctionExpression implements SpiJunction, SpiExpression, Expression return exprList.findSet(); } + @Override + public T findOne() { + return exprList.findOne(); + } + + @Override + public Optional findOneOrEmpty() { + return exprList.findOneOrEmpty(); + } + @Override public T findUnique() { return exprList.findUnique(); diff --git a/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmQuery.java b/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmQuery.java index 2f87fa974..5f4c32eeb 100644 --- a/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmQuery.java +++ b/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmQuery.java @@ -50,6 +50,7 @@ import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.function.Consumer; import java.util.function.Predicate; @@ -1255,10 +1256,20 @@ public class DefaultOrmQuery implements SpiQuery { } @Override - public T findUnique() { + public T findOne() { return server.findUnique(this, null); } + @Override + public Optional findOneOrEmpty() { + return server.findOneOrEmpty(this, null); + } + + @Override + public T findUnique() { + return findOne(); + } + @Override public FutureIds findFutureIds() { return server.findFutureIds(this, null);