diff --git a/src/main/java/io/ebean/ExpressionList.java b/src/main/java/io/ebean/ExpressionList.java index 336be5dfb..c84c9635e 100644 --- a/src/main/java/io/ebean/ExpressionList.java +++ b/src/main/java/io/ebean/ExpressionList.java @@ -5,9 +5,9 @@ import io.ebean.search.MultiMatch; import io.ebean.search.TextCommonTerms; import io.ebean.search.TextQueryString; import io.ebean.search.TextSimple; -import javax.annotation.Nullable; import javax.annotation.Nonnull; +import javax.annotation.Nullable; import javax.persistence.NonUniqueResultException; import java.sql.Timestamp; import java.util.Collection; @@ -261,6 +261,24 @@ public interface ExpressionList { @Nonnull List findSingleAttributeList(); + /** + * Execute a query returning a single value of a single property/column. + *

+ *

{@code
+   *
+   *  String name =
+   *    Ebean.find(Customer.class)
+   *      .select("name")
+   *      .where().eq("id", 42)
+   *      .findSingleAttribute();
+   *
+   * }
+ */ + default
A findSingleAttribute() { + List list = findSingleAttributeList(); + return !list.isEmpty() ? list.get(0) : null; + } + /** * Execute the query returning a single bean or null (if no matching * bean is found). diff --git a/src/main/java/io/ebean/Query.java b/src/main/java/io/ebean/Query.java index 1dac8b938..b92067a46 100644 --- a/src/main/java/io/ebean/Query.java +++ b/src/main/java/io/ebean/Query.java @@ -813,6 +813,21 @@ public interface Query { @Nonnull List findSingleAttributeList(); + /** + * Execute a query returning a single value of a single property/column. + *

+ *

{@code
+   *
+   *  String name =
+   *    Ebean.find(Customer.class)
+   *      .select("name")
+   *      .where().eq("id", 42)
+   *      .findSingleAttribute();
+   *
+   * }
+ */ +
A findSingleAttribute(); + /** * Execute the query returning either a single bean or null (if no matching * bean is found). diff --git a/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmQuery.java b/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmQuery.java index ec52298f2..0ff7b3b29 100644 --- a/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmQuery.java +++ b/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmQuery.java @@ -1284,6 +1284,12 @@ public class DefaultOrmQuery implements SpiQuery { return (List) server.findSingleAttributeList(this, null); } + @Override + public A findSingleAttribute() { + List list = findSingleAttributeList(); + return !list.isEmpty() ? list.get(0) : null; + } + @Override public T findOne() { return server.findOne(this, null); diff --git a/src/test/java/org/tests/query/other/TestQuerySingleAttribute.java b/src/test/java/org/tests/query/other/TestQuerySingleAttribute.java index b02a53c2f..dc071c428 100644 --- a/src/test/java/org/tests/query/other/TestQuerySingleAttribute.java +++ b/src/test/java/org/tests/query/other/TestQuerySingleAttribute.java @@ -75,12 +75,40 @@ public class TestQuerySingleAttribute extends BaseTestCase { Query query = Ebean.find(Customer.class).select("name"); - List names = query.findSingleAttributeList();//String.class); + List names = query.findSingleAttributeList(); assertThat(sqlOf(query)).contains("select t0.name from o_customer t0"); assertThat(names).isNotNull(); } + @Test + public void findSingleAttribute() { + + ResetBasicData.reset(); + + Query query = Ebean.find(Customer.class) + .select("name") + .where().eq("id", 1).query(); + + String name = query.findSingleAttribute(); + + assertThat(sqlOf(query)).contains("select t0.name from o_customer t0"); + assertThat(name).isNotNull(); + } + + @Test + public void findSingleAttribute_viaExpression() { + + ResetBasicData.reset(); + + String name = Ebean.find(Customer.class) + .select("name") + .where().eq("id", 1) + .findSingleAttribute(); + + assertThat(name).isNotNull(); + } + @Test public void distinctAndWhere() { @@ -321,89 +349,89 @@ public class TestQuerySingleAttribute extends BaseTestCase { assertThat(sqlOf(query)).contains("select distinct t1.billing_address_id from contact t0 join o_customer t1 on t1.id = t0.customer_id order by t1.billing_address_id desc"); } - - @Test - public void distinctWithOrderByPkAndQuery() { - - ResetBasicData.reset(); - - Query query = Ebean.find(Contact.class) - .setDistinct(true) - .fetch("customer","billingAddress") + + @Test + public void distinctWithOrderByPkAndQuery() { + + ResetBasicData.reset(); + + Query query = Ebean.find(Contact.class) + .setDistinct(true) + .fetch("customer","billingAddress") .where().eq("customer.billingAddress.city", "Auckland") - .orderBy().desc("customer.billingAddress.id"); - - List ids = query.findSingleAttributeList(); + .orderBy().desc("customer.billingAddress.id"); + + List ids = query.findSingleAttributeList(); assertThat(ids).isNotEmpty(); assertThat(sqlOf(query)).contains("select distinct t1.billing_address_id from contact t0 " + "join o_customer t1 on t1.id = t0.customer_id " // two spaces! + "left join o_address t2 on t2.id = t1.billing_address_id " + "where t2.city = ? " - + "order by t1.billing_address_id desc"); - } - - @Test - public void distinctWithCascadedFetchOrderByPkAndQuery() { - - ResetBasicData.reset(); - - Query query = Ebean.find(Contact.class) - .setDistinct(true) - .fetch("customer","billingAddress") - .where().eq("customer.billingAddress.city", "Auckland") - .orderBy().desc("customer.billingAddress.id"); - - List ids = query.findSingleAttributeList(); - assertThat(ids).isNotEmpty(); - - assertThat(sqlOf(query)).contains("select distinct t1.billing_address_id from contact t0 " - + "join o_customer t1 on t1.id = t0.customer_id " - + "left join o_address t2 on t2.id = t1.billing_address_id " - + "where t2.city = ? " - + "order by t1.billing_address_id desc"); + + "order by t1.billing_address_id desc"); } - @Test - public void distinctWithCascadedFetchOrderByPkAndQuery3() { - - ResetBasicData.reset(); - - Query query = Ebean.find(Contact.class) - .setDistinct(true) + @Test + public void distinctWithCascadedFetchOrderByPkAndQuery() { + + ResetBasicData.reset(); + + Query query = Ebean.find(Contact.class) + .setDistinct(true) .fetch("customer","billingAddress") .where().eq("customer.billingAddress.city", "Auckland") - .orderBy().desc("customer.billingAddress.id"); - - List ids = query.findSingleAttributeList(); + .orderBy().desc("customer.billingAddress.id"); + + List ids = query.findSingleAttributeList(); assertThat(ids).isNotEmpty(); - + assertThat(sqlOf(query)).contains("select distinct t1.billing_address_id from contact t0 " - + "join o_customer t1 on t1.id = t0.customer_id " + + "join o_customer t1 on t1.id = t0.customer_id " + "left join o_address t2 on t2.id = t1.billing_address_id " + "where t2.city = ? " - + "order by t1.billing_address"); + + "order by t1.billing_address_id desc"); } - - @Test - public void distinctWithCascadedFetchOrderByPkAndQuery2() { - - ResetBasicData.reset(); - - Query query = Ebean.find(Contact.class) - .setDistinct(true) - .fetch("customer","billingAddress") - .where().eq("customer.shippingAddress.city", "Auckland") // query on shippingAddress - .orderBy().desc("customer.billingAddress.id"); - - List ids = query.findSingleAttributeList(); + + @Test + public void distinctWithCascadedFetchOrderByPkAndQuery3() { + + ResetBasicData.reset(); + + Query query = Ebean.find(Contact.class) + .setDistinct(true) + .fetch("customer","billingAddress") + .where().eq("customer.billingAddress.city", "Auckland") + .orderBy().desc("customer.billingAddress.id"); + + List ids = query.findSingleAttributeList(); assertThat(ids).isNotEmpty(); - + assertThat(sqlOf(query)).contains("select distinct t1.billing_address_id from contact t0 " - + "join o_customer t1 on t1.id = t0.customer_id " + + "join o_customer t1 on t1.id = t0.customer_id " + + "left join o_address t2 on t2.id = t1.billing_address_id " + + "where t2.city = ? " + + "order by t1.billing_address"); + } + + @Test + public void distinctWithCascadedFetchOrderByPkAndQuery2() { + + ResetBasicData.reset(); + + Query query = Ebean.find(Contact.class) + .setDistinct(true) + .fetch("customer","billingAddress") + .where().eq("customer.shippingAddress.city", "Auckland") // query on shippingAddress + .orderBy().desc("customer.billingAddress.id"); + + List ids = query.findSingleAttributeList(); + assertThat(ids).isNotEmpty(); + + assertThat(sqlOf(query)).contains("select distinct t1.billing_address_id from contact t0 " + + "join o_customer t1 on t1.id = t0.customer_id " + "left join o_address t2 on t2.id = t1.shipping_address_id " + "where t2.city = ? " - + "order by t1.billing_address_id desc"); + + "order by t1.billing_address_id desc"); } }