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);