diff --git a/src/main/java/io/ebean/EbeanServer.java b/src/main/java/io/ebean/EbeanServer.java
index 68a956cd9..769518ca8 100644
--- a/src/main/java/io/ebean/EbeanServer.java
+++ b/src/main/java/io/ebean/EbeanServer.java
@@ -1177,6 +1177,16 @@ public interface EbeanServer {
* @see SqlQuery#findUnique()
*/
@Nullable
+ SqlRow findOne(SqlQuery 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
SqlRow findUnique(SqlQuery query, Transaction transaction);
/**
diff --git a/src/main/java/io/ebean/SqlQuery.java b/src/main/java/io/ebean/SqlQuery.java
index 514dde3d9..e264268c2 100644
--- a/src/main/java/io/ebean/SqlQuery.java
+++ b/src/main/java/io/ebean/SqlQuery.java
@@ -2,6 +2,7 @@ package io.ebean;
import java.io.Serializable;
import java.util.List;
+import java.util.Optional;
import java.util.function.Consumer;
import java.util.function.Predicate;
@@ -70,6 +71,16 @@ public interface SqlQuery extends Serializable {
* PersistenceException.
*
*/
+ SqlRow findOne();
+
+ /**
+ * Execute the query returning an optional row.
+ */
+ Optional findOneOrEmpty();
+
+ /**
+ * Synonym for findOne().
+ */
SqlRow findUnique();
/**
diff --git a/src/main/java/io/ebeaninternal/server/core/DefaultServer.java b/src/main/java/io/ebeaninternal/server/core/DefaultServer.java
index d70e76ac7..88e5659b9 100644
--- a/src/main/java/io/ebeaninternal/server/core/DefaultServer.java
+++ b/src/main/java/io/ebeaninternal/server/core/DefaultServer.java
@@ -1503,6 +1503,11 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer {
@Override
public SqlRow findUnique(SqlQuery query, Transaction t) {
+ return findOne(query, t);
+ }
+
+ @Override
+ public SqlRow findOne(SqlQuery query, Transaction t) {
// no findId() method for SqlQuery...
// a query that is expected to return either 0 or 1 rows
diff --git a/src/main/java/io/ebeaninternal/server/querydefn/DefaultRelationalQuery.java b/src/main/java/io/ebeaninternal/server/querydefn/DefaultRelationalQuery.java
index d6efbeec8..e13ea2d36 100644
--- a/src/main/java/io/ebeaninternal/server/querydefn/DefaultRelationalQuery.java
+++ b/src/main/java/io/ebeaninternal/server/querydefn/DefaultRelationalQuery.java
@@ -6,6 +6,7 @@ import io.ebeaninternal.api.BindParams;
import io.ebeaninternal.api.SpiSqlQuery;
import java.util.List;
+import java.util.Optional;
import java.util.function.Consumer;
import java.util.function.Predicate;
@@ -61,9 +62,19 @@ public class DefaultRelationalQuery implements SpiSqlQuery {
return server.findList(this, null);
}
+ @Override
+ public SqlRow findOne() {
+ return server.findOne(this, null);
+ }
+
+ @Override
+ public Optional findOneOrEmpty() {
+ return Optional.ofNullable(findOne());
+ }
+
@Override
public SqlRow findUnique() {
- return server.findUnique(this, null);
+ return findOne();
}
@Override
diff --git a/src/test/java/io/ebean/SqlRowBooleanTest.java b/src/test/java/io/ebean/SqlRowBooleanTest.java
index c2c7a6f15..aa17fb287 100644
--- a/src/test/java/io/ebean/SqlRowBooleanTest.java
+++ b/src/test/java/io/ebean/SqlRowBooleanTest.java
@@ -15,7 +15,7 @@ public class SqlRowBooleanTest extends BaseTestCase {
} else {
sqlQuery = Ebean.createSqlQuery("SELECT 1 IS NOT NULL AS ISNT_NULL");
}
- SqlRow row = sqlQuery.findUnique();
+ SqlRow row = sqlQuery.findOne();
Boolean value = row.getBoolean("ISNT_NULL");
assertThat(value).isTrue();
}
diff --git a/src/test/java/io/ebeaninternal/api/TDSpiEbeanServer.java b/src/test/java/io/ebeaninternal/api/TDSpiEbeanServer.java
index c3c51c4fe..6f9f8f228 100644
--- a/src/test/java/io/ebeaninternal/api/TDSpiEbeanServer.java
+++ b/src/test/java/io/ebeaninternal/api/TDSpiEbeanServer.java
@@ -568,6 +568,11 @@ public class TDSpiEbeanServer implements SpiEbeanServer {
public void findEachWhile(SqlQuery query, Predicate consumer, Transaction transaction) {
}
+ @Override
+ public SqlRow findOne(SqlQuery query, Transaction transaction) {
+ return null;
+ }
+
@Override
public SqlRow findUnique(SqlQuery query, Transaction transaction) {
return null;
diff --git a/src/test/java/org/tests/basic/encrypt/TestEncrypt.java b/src/test/java/org/tests/basic/encrypt/TestEncrypt.java
index 48d78a6a1..e155bc821 100644
--- a/src/test/java/org/tests/basic/encrypt/TestEncrypt.java
+++ b/src/test/java/org/tests/basic/encrypt/TestEncrypt.java
@@ -58,7 +58,7 @@ public class TestEncrypt extends BaseTestCase {
SqlQuery q = Ebean.createSqlQuery("select * from e_basicenc where id = :id");
q.setParameter("id", e.getId());
- SqlRow row = q.findUnique();
+ SqlRow row = q.findOne();
row.getString("name");
row.get("description");
diff --git a/src/test/java/org/tests/basic/encrypt/TestEncryptBinary.java b/src/test/java/org/tests/basic/encrypt/TestEncryptBinary.java
index 6034cdcd3..7378388e0 100644
--- a/src/test/java/org/tests/basic/encrypt/TestEncryptBinary.java
+++ b/src/test/java/org/tests/basic/encrypt/TestEncryptBinary.java
@@ -27,7 +27,7 @@ public class TestEncryptBinary extends BaseTestCase {
SqlQuery q = Ebean.createSqlQuery("select * from e_basicenc_bin where id = :id");
q.setParameter("id", e.getId());
- SqlRow row = q.findUnique();
+ SqlRow row = q.findOne();
row.getString("name");
row.get("data");
row.get("some_time");
diff --git a/src/test/java/org/tests/basic/type/TestEnumValueAnnotation.java b/src/test/java/org/tests/basic/type/TestEnumValueAnnotation.java
index 0645aeb8d..bfbd785b7 100644
--- a/src/test/java/org/tests/basic/type/TestEnumValueAnnotation.java
+++ b/src/test/java/org/tests/basic/type/TestEnumValueAnnotation.java
@@ -11,6 +11,8 @@ import org.tests.model.basic.EBasicEnumInt;
import org.junit.Assert;
import org.junit.Test;
+import java.util.Optional;
+
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
@@ -28,7 +30,7 @@ public class TestEnumValueAnnotation extends BaseTestCase {
SqlQuery q = Ebean.createSqlQuery("select * from e_basic where id = :id");
q.setParameter("id", b.getId());
- SqlRow sqlRow = q.findUnique();
+ SqlRow sqlRow = q.findOne();
String strStatus = sqlRow.getString("status");
assertEquals("N", strStatus);
@@ -56,7 +58,7 @@ public class TestEnumValueAnnotation extends BaseTestCase {
SqlQuery q = Ebean.createSqlQuery("select * from e_basic_enum_id where status = :status");
q.setParameter("status", b.getStatus());
- SqlRow sqlRow = q.findUnique();
+ SqlRow sqlRow = q.findOne();
String strStatus = sqlRow.getString("status");
assertEquals("N", strStatus);
@@ -82,10 +84,11 @@ public class TestEnumValueAnnotation extends BaseTestCase {
SqlQuery q = Ebean.createSqlQuery("select * from e_basic_eni where id = :id");
q.setParameter("id", b.getId());
- SqlRow sqlRow = q.findUnique();
- Integer intStatus = sqlRow.getInteger("status");
-
- assertEquals(Integer.valueOf(1), intStatus);
+ Optional sqlRow = q.findOneOrEmpty();
+ sqlRow.ifPresent(sqlRow1 -> {
+ Integer intStatus = sqlRow1.getInteger("status");
+ assertEquals(Integer.valueOf(1), intStatus);
+ });
EBasicEnumInt b2 = Ebean.find(EBasicEnumInt.class)