From c0bdc03969e6963740bc1d0c3fc71d6996495227 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20Westk=C3=A4mper?= Date: Thu, 17 Feb 2011 20:01:41 +0000 Subject: [PATCH] #717563 : unified Projectable.uniqueResult() semantics --- .../collections/UniqueResultContract.java | 14 +++++++++++ .../query/NonUniqueResultException.java | 19 ++++++++++++++ .../java/com/mysema/query/Projectable.java | 7 +++--- .../com/mysema/query/SimpleProjectable.java | 3 ++- .../query/support/ProjectableQuery.java | 25 +++++++++++++++---- .../com/mysema/query/search/SearchQuery.java | 7 +++++- .../mysema/query/search/SearchQueryTest.java | 6 +++++ .../mysema/query/jdo/AbstractJDOQLQuery.java | 22 +++++++++++++--- .../java/com/mysema/query/jdo/BasicsTest.java | 6 +++++ .../jpa/hibernate/AbstractHibernateQuery.java | 9 +++++-- .../jpa/hibernate/sql/HibernateSQLQuery.java | 9 +++++-- .../query/jpa/impl/AbstractJPAQuery.java | 7 +++--- .../com/mysema/query/jpa/sql/JPASQLQuery.java | 5 +++- .../query/lucene/AbstractLuceneQuery.java | 3 ++- .../mysema/query/mongodb/MongodbQuery.java | 11 +++++++- .../query/mongodb/MongodbQueryTest.java | 6 +++++ .../mysema/query/sql/AbstractSQLQuery.java | 11 +++++++- .../mysema/query/BeanPopulationBaseTest.java | 5 +++- .../java/com/mysema/query/SelectBaseTest.java | 13 +++++++--- 19 files changed, 158 insertions(+), 30 deletions(-) create mode 100644 querydsl-collections/src/test/java/com/mysema/query/collections/UniqueResultContract.java create mode 100644 querydsl-core/src/main/java/com/mysema/query/NonUniqueResultException.java diff --git a/querydsl-collections/src/test/java/com/mysema/query/collections/UniqueResultContract.java b/querydsl-collections/src/test/java/com/mysema/query/collections/UniqueResultContract.java new file mode 100644 index 000000000..e6ec30b2b --- /dev/null +++ b/querydsl-collections/src/test/java/com/mysema/query/collections/UniqueResultContract.java @@ -0,0 +1,14 @@ +package com.mysema.query.collections; + +import org.junit.Test; + +import com.mysema.query.NonUniqueResultException; + +public class UniqueResultContract extends AbstractQueryTest{ + + @Test(expected=NonUniqueResultException.class) + public void Unique_Result_Throws_Exception_On_Multiple_Results(){ + MiniApi.from(cat, cats).where(cat.name.isNotNull()).uniqueResult(cat); + } + +} diff --git a/querydsl-core/src/main/java/com/mysema/query/NonUniqueResultException.java b/querydsl-core/src/main/java/com/mysema/query/NonUniqueResultException.java new file mode 100644 index 000000000..f5fb52d86 --- /dev/null +++ b/querydsl-core/src/main/java/com/mysema/query/NonUniqueResultException.java @@ -0,0 +1,19 @@ +package com.mysema.query; + +/** + * @author tiwe + * + */ +public class NonUniqueResultException extends QueryException{ + + private static final long serialVersionUID = -1757423191400510323L; + + public NonUniqueResultException() { + super("Only one result is allowed for uniqueResult calls"); + } + + public NonUniqueResultException(String message) { + super(message); + } + +} diff --git a/querydsl-core/src/main/java/com/mysema/query/Projectable.java b/querydsl-core/src/main/java/com/mysema/query/Projectable.java index 3d6ae0193..bef86fa8c 100644 --- a/querydsl-core/src/main/java/com/mysema/query/Projectable.java +++ b/querydsl-core/src/main/java/com/mysema/query/Projectable.java @@ -196,6 +196,7 @@ public interface Projectable { * @param first * @param second * @param rest + * @throws NonUniqueResultException if there is more than one matching result * @return */ @Nullable @@ -203,10 +204,9 @@ public interface Projectable { /** * return a unique result for the given projection or null if not result is found - * - *

for multiple results only the first one is returned

* * @param args + * @throws NonUniqueResultException if there is more than one matching result * @return */ @Nullable @@ -214,12 +214,11 @@ public interface Projectable { /** * return a unique result for the given projection or null if not result is found - * - *

for multiple results only the first one is returned

* * @param * return type * @param projection + * @throws NonUniqueResultException if there is more than one matching result * @return the result or null for an empty result */ @Nullable diff --git a/querydsl-core/src/main/java/com/mysema/query/SimpleProjectable.java b/querydsl-core/src/main/java/com/mysema/query/SimpleProjectable.java index 7d834f774..4caaf4591 100644 --- a/querydsl-core/src/main/java/com/mysema/query/SimpleProjectable.java +++ b/querydsl-core/src/main/java/com/mysema/query/SimpleProjectable.java @@ -49,7 +49,8 @@ public interface SimpleProjectable { /** * Get the projection as a unique result - * + * + * @throws NonUniqueResultException if there is more than one matching result * @return */ @Nullable diff --git a/querydsl-core/src/main/java/com/mysema/query/support/ProjectableQuery.java b/querydsl-core/src/main/java/com/mysema/query/support/ProjectableQuery.java index f9a9dee22..bb86a69de 100644 --- a/querydsl-core/src/main/java/com/mysema/query/support/ProjectableQuery.java +++ b/querydsl-core/src/main/java/com/mysema/query/support/ProjectableQuery.java @@ -13,6 +13,7 @@ import java.util.Map; import org.apache.commons.collections15.IteratorUtils; import com.mysema.commons.lang.CloseableIterator; +import com.mysema.query.NonUniqueResultException; import com.mysema.query.Projectable; import com.mysema.query.SearchResults; import com.mysema.query.types.Expression; @@ -128,15 +129,29 @@ public abstract class ProjectableQuery> public Object[] uniqueResult(Expression[] args) { queryMixin.setUnique(true); - Iterator it = iterate(args); - return it.hasNext() ? it.next() : null; + return getUniqueResult(iterate(args)); } @Override public RT uniqueResult(Expression expr) { queryMixin.setUnique(true); - limit(1l); - Iterator it = iterate(expr); - return it.hasNext() ? it.next() : null; + if (queryMixin.getMetadata().getModifiers().getLimit() == null){ + limit(2l); + } + return getUniqueResult(iterate(expr)); } + + protected T getUniqueResult(Iterator it) { + if (it.hasNext()){ + T rv = it.next(); + if (it.hasNext()){ + throw new NonUniqueResultException(); + } + return rv; + }else{ + return null; + } + } + + } diff --git a/querydsl-hibernate-search/src/main/java/com/mysema/query/search/SearchQuery.java b/querydsl-hibernate-search/src/main/java/com/mysema/query/search/SearchQuery.java index 44c57dbb1..3d24b8e27 100644 --- a/querydsl-hibernate-search/src/main/java/com/mysema/query/search/SearchQuery.java +++ b/querydsl-hibernate-search/src/main/java/com/mysema/query/search/SearchQuery.java @@ -15,6 +15,7 @@ import org.hibernate.search.Search; import com.mysema.commons.lang.Assert; import com.mysema.commons.lang.CloseableIterator; import com.mysema.commons.lang.IteratorAdapter; +import com.mysema.query.NonUniqueResultException; import com.mysema.query.QueryMetadata; import com.mysema.query.QueryModifiers; import com.mysema.query.SearchResults; @@ -159,7 +160,11 @@ public class SearchQuery implements SimpleQuery>, SimpleProjec @SuppressWarnings("unchecked") @Override public T uniqueResult() { - return (T) createQuery(false).uniqueResult(); + try{ + return (T) createQuery(false).uniqueResult(); + }catch (org.hibernate.NonUniqueResultException e){ + throw new NonUniqueResultException(); + } } @Override diff --git a/querydsl-hibernate-search/src/test/java/com/mysema/query/search/SearchQueryTest.java b/querydsl-hibernate-search/src/test/java/com/mysema/query/search/SearchQueryTest.java index 3c80a2b7e..1cd4c53a2 100644 --- a/querydsl-hibernate-search/src/test/java/com/mysema/query/search/SearchQueryTest.java +++ b/querydsl-hibernate-search/src/test/java/com/mysema/query/search/SearchQueryTest.java @@ -15,6 +15,7 @@ import java.util.List; import org.hibernate.Session; import org.junit.Test; +import com.mysema.query.NonUniqueResultException; import com.mysema.query.SearchResults; import com.mysema.query.types.OrderSpecifier; import com.mysema.query.types.expr.BooleanExpression; @@ -57,6 +58,11 @@ public class SearchQueryTest extends AbstractQueryTest{ assertEquals(u, list.get(0)); } + @Test(expected=NonUniqueResultException.class) + public void Unique_Result_Throws_Exception_On_Multiple_Results(){ + query().where(user.middleName.eq("X")).uniqueResult(); + } + @Test public void Ordering(){ BooleanExpression filter = user.middleName.eq("X"); diff --git a/querydsl-jdo/src/main/java/com/mysema/query/jdo/AbstractJDOQLQuery.java b/querydsl-jdo/src/main/java/com/mysema/query/jdo/AbstractJDOQLQuery.java index fda6b0bda..85d5c21c3 100644 --- a/querydsl-jdo/src/main/java/com/mysema/query/jdo/AbstractJDOQLQuery.java +++ b/querydsl-jdo/src/main/java/com/mysema/query/jdo/AbstractJDOQLQuery.java @@ -24,6 +24,7 @@ import org.slf4j.LoggerFactory; import com.mysema.commons.lang.CloseableIterator; import com.mysema.commons.lang.IteratorAdapter; import com.mysema.query.DefaultQueryMetadata; +import com.mysema.query.NonUniqueResultException; import com.mysema.query.QueryException; import com.mysema.query.QueryMetadata; import com.mysema.query.QueryModifiers; @@ -270,9 +271,24 @@ public abstract class AbstractJDOQLQuery> extend @Nullable public RT uniqueResult(Expression expr) { queryMixin.addToProjection(expr); - Query query = createQuery(false); - query.setUnique(true); + if (getMetadata().getModifiers().getLimit() == null){ + limit(2); + } + Query query = createQuery(false); reset(); - return (RT) execute(query); + Object rv = execute(query); + if (rv instanceof List){ + List list = (List)rv; + if (!list.isEmpty()){ + if (list.size() > 1){ + throw new NonUniqueResultException(); + } + return list.get(0); + }else{ + return null; + } + }else{ + return (RT)rv; + } } } diff --git a/querydsl-jdo/src/test/java/com/mysema/query/jdo/BasicsTest.java b/querydsl-jdo/src/test/java/com/mysema/query/jdo/BasicsTest.java index 8497f1add..b85d09cd6 100644 --- a/querydsl-jdo/src/test/java/com/mysema/query/jdo/BasicsTest.java +++ b/querydsl-jdo/src/test/java/com/mysema/query/jdo/BasicsTest.java @@ -17,6 +17,7 @@ import org.junit.Ignore; import org.junit.Test; import com.mysema.query.BooleanBuilder; +import com.mysema.query.NonUniqueResultException; import com.mysema.query.jdo.test.domain.Book; import com.mysema.query.jdo.test.domain.Product; import com.mysema.query.jdo.test.domain.QBook; @@ -67,6 +68,11 @@ public class BasicsTest extends AbstractJDOTest { public void CountTests() { assertEquals("count", 2, query().from(product).count()); } + + @Test(expected=NonUniqueResultException.class) + public void Unique_Result_Throws_Exception_On_Multiple_Results(){ + query().from(product).uniqueResult(product); + } @Test public void SimpleTest() throws IOException{ diff --git a/querydsl-jpa/src/main/java/com/mysema/query/jpa/hibernate/AbstractHibernateQuery.java b/querydsl-jpa/src/main/java/com/mysema/query/jpa/hibernate/AbstractHibernateQuery.java index 8992a8646..55e6f016e 100644 --- a/querydsl-jpa/src/main/java/com/mysema/query/jpa/hibernate/AbstractHibernateQuery.java +++ b/querydsl-jpa/src/main/java/com/mysema/query/jpa/hibernate/AbstractHibernateQuery.java @@ -22,6 +22,7 @@ import org.slf4j.LoggerFactory; import com.mysema.commons.lang.CloseableIterator; import com.mysema.commons.lang.IteratorAdapter; import com.mysema.query.DefaultQueryMetadata; +import com.mysema.query.NonUniqueResultException; import com.mysema.query.QueryException; import com.mysema.query.QueryMetadata; import com.mysema.query.QueryModifiers; @@ -351,8 +352,12 @@ public abstract class AbstractHibernateQuery String queryString = toQueryString(); logQuery(queryString); Query query = createQuery(queryString, modifiers); - reset(); - return (RT) query.uniqueResult(); + reset(); + try{ + return (RT) query.uniqueResult(); + }catch (org.hibernate.NonUniqueResultException e){ + throw new NonUniqueResultException(); + } } } diff --git a/querydsl-jpa/src/main/java/com/mysema/query/jpa/hibernate/sql/HibernateSQLQuery.java b/querydsl-jpa/src/main/java/com/mysema/query/jpa/hibernate/sql/HibernateSQLQuery.java index 19c24ace5..69d81c6e8 100644 --- a/querydsl-jpa/src/main/java/com/mysema/query/jpa/hibernate/sql/HibernateSQLQuery.java +++ b/querydsl-jpa/src/main/java/com/mysema/query/jpa/hibernate/sql/HibernateSQLQuery.java @@ -19,6 +19,7 @@ import org.slf4j.LoggerFactory; import com.mysema.commons.lang.CloseableIterator; import com.mysema.commons.lang.IteratorAdapter; import com.mysema.query.DefaultQueryMetadata; +import com.mysema.query.NonUniqueResultException; import com.mysema.query.QueryMetadata; import com.mysema.query.QueryModifiers; import com.mysema.query.SearchResults; @@ -201,8 +202,12 @@ public final class HibernateSQLQuery extends AbstractSQLQuery @SuppressWarnings("unchecked") public RT uniqueResult(Expression expr) { Query query = createQuery(expr); - reset(); - return (RT) query.uniqueResult(); + reset(); + try{ + return (RT) query.uniqueResult(); + }catch (org.hibernate.NonUniqueResultException e){ + throw new NonUniqueResultException(); + } } /** diff --git a/querydsl-jpa/src/main/java/com/mysema/query/jpa/impl/AbstractJPAQuery.java b/querydsl-jpa/src/main/java/com/mysema/query/jpa/impl/AbstractJPAQuery.java index 0669248c1..7c1778a82 100644 --- a/querydsl-jpa/src/main/java/com/mysema/query/jpa/impl/AbstractJPAQuery.java +++ b/querydsl-jpa/src/main/java/com/mysema/query/jpa/impl/AbstractJPAQuery.java @@ -13,7 +13,6 @@ import java.util.Map; import javax.annotation.Nullable; import javax.persistence.EntityManager; import javax.persistence.LockModeType; -import javax.persistence.NoResultException; import javax.persistence.Query; import org.slf4j.Logger; @@ -22,6 +21,7 @@ import org.slf4j.LoggerFactory; import com.mysema.commons.lang.CloseableIterator; import com.mysema.commons.lang.IteratorAdapter; import com.mysema.query.DefaultQueryMetadata; +import com.mysema.query.NonUniqueResultException; import com.mysema.query.QueryException; import com.mysema.query.QueryMetadata; import com.mysema.query.QueryModifiers; @@ -216,11 +216,12 @@ public abstract class AbstractJPAQuery> extends JP reset(); try{ return (RT) query.getSingleResult(); - }catch(NoResultException e){ + }catch(javax.persistence.NoResultException e){ logger.debug(e.getMessage(),e); return null; + }catch(javax.persistence.NonUniqueResultException e){ + throw new NonUniqueResultException(); } - } @SuppressWarnings("unchecked") diff --git a/querydsl-jpa/src/main/java/com/mysema/query/jpa/sql/JPASQLQuery.java b/querydsl-jpa/src/main/java/com/mysema/query/jpa/sql/JPASQLQuery.java index c5684b56c..4dfa3538a 100644 --- a/querydsl-jpa/src/main/java/com/mysema/query/jpa/sql/JPASQLQuery.java +++ b/querydsl-jpa/src/main/java/com/mysema/query/jpa/sql/JPASQLQuery.java @@ -19,6 +19,7 @@ import org.slf4j.LoggerFactory; import com.mysema.commons.lang.CloseableIterator; import com.mysema.commons.lang.IteratorAdapter; import com.mysema.query.DefaultQueryMetadata; +import com.mysema.query.NonUniqueResultException; import com.mysema.query.QueryMetadata; import com.mysema.query.QueryModifiers; import com.mysema.query.SearchResults; @@ -176,9 +177,11 @@ public final class JPASQLQuery extends AbstractSQLQuery implements reset(); try{ return (RT) query.getSingleResult(); - }catch(NoResultException e){ + }catch(javax.persistence.NoResultException e){ logger.debug(e.getMessage(),e); return null; + }catch(javax.persistence.NonUniqueResultException e){ + throw new NonUniqueResultException(); } } diff --git a/querydsl-lucene/src/main/java/com/mysema/query/lucene/AbstractLuceneQuery.java b/querydsl-lucene/src/main/java/com/mysema/query/lucene/AbstractLuceneQuery.java index b667bde95..0d1af174f 100644 --- a/querydsl-lucene/src/main/java/com/mysema/query/lucene/AbstractLuceneQuery.java +++ b/querydsl-lucene/src/main/java/com/mysema/query/lucene/AbstractLuceneQuery.java @@ -14,6 +14,7 @@ import org.apache.lucene.search.Sort; import com.mysema.commons.lang.CloseableIterator; import com.mysema.commons.lang.EmptyCloseableIterator; import com.mysema.commons.lang.IteratorAdapter; +import com.mysema.query.NonUniqueResultException; import com.mysema.query.QueryException; import com.mysema.query.QueryMetadata; import com.mysema.query.QueryModifiers; @@ -202,7 +203,7 @@ SimpleProjectable { } final ScoreDoc[] scoreDocs = searcher.search(createQuery(), maxDoc).scoreDocs; if (scoreDocs.length > 1) { - throw new QueryException("More than one result found!"); + throw new NonUniqueResultException(); } else if (scoreDocs.length == 1) { return transformer.transform(searcher.doc(scoreDocs[0].doc)); } else { diff --git a/querydsl-mongodb/src/main/java/com/mysema/query/mongodb/MongodbQuery.java b/querydsl-mongodb/src/main/java/com/mysema/query/mongodb/MongodbQuery.java index c08afebd3..a45d6f618 100644 --- a/querydsl-mongodb/src/main/java/com/mysema/query/mongodb/MongodbQuery.java +++ b/querydsl-mongodb/src/main/java/com/mysema/query/mongodb/MongodbQuery.java @@ -15,6 +15,7 @@ import com.mongodb.DBCollection; import com.mongodb.DBCursor; import com.mongodb.DBObject; import com.mysema.commons.lang.CloseableIterator; +import com.mysema.query.NonUniqueResultException; import com.mysema.query.QueryMetadata; import com.mysema.query.QueryModifiers; import com.mysema.query.SearchResults; @@ -148,7 +149,15 @@ public class MongodbQuery implements SimpleQuery>, SimpleProj @Override public K uniqueResult() { DBCursor c = createCursor().limit(1); - return c.hasNext() ? transformer.transform(c.next()) : null; + if (c.hasNext()){ + K rv = transformer.transform(c.next()); + if (c.hasNext()){ + throw new NonUniqueResultException(); + } + return rv; + }else{ + return null; + } } @Override diff --git a/querydsl-mongodb/src/test/java/com/mysema/query/mongodb/MongodbQueryTest.java b/querydsl-mongodb/src/test/java/com/mysema/query/mongodb/MongodbQueryTest.java index bddfceb61..579012321 100644 --- a/querydsl-mongodb/src/test/java/com/mysema/query/mongodb/MongodbQueryTest.java +++ b/querydsl-mongodb/src/test/java/com/mysema/query/mongodb/MongodbQueryTest.java @@ -20,6 +20,7 @@ import org.junit.Test; import com.google.code.morphia.Datastore; import com.google.code.morphia.Morphia; +import com.mysema.query.NonUniqueResultException; import com.mysema.query.SearchResults; import com.mysema.query.mongodb.domain.Address; import com.mysema.query.mongodb.domain.City; @@ -59,6 +60,11 @@ public class MongodbQueryTest { public void UniqueResult(){ assertEquals("Jantunen", where(user.firstName.eq("Jaakko")).uniqueResult().getLastName()); } + + @Test(expected=NonUniqueResultException.class) + public void UniqueResultContract(){ + where(user.firstName.isNotNull()).uniqueResult(); + } @Test public void LongPath(){ diff --git a/querydsl-sql/src/main/java/com/mysema/query/sql/AbstractSQLQuery.java b/querydsl-sql/src/main/java/com/mysema/query/sql/AbstractSQLQuery.java index 5ab83d207..c3e53722b 100644 --- a/querydsl-sql/src/main/java/com/mysema/query/sql/AbstractSQLQuery.java +++ b/querydsl-sql/src/main/java/com/mysema/query/sql/AbstractSQLQuery.java @@ -27,6 +27,7 @@ import com.mysema.commons.lang.IteratorAdapter; import com.mysema.query.DefaultQueryMetadata; import com.mysema.query.JoinExpression; import com.mysema.query.JoinFlag; +import com.mysema.query.NonUniqueResultException; import com.mysema.query.QueryException; import com.mysema.query.QueryFlag; import com.mysema.query.QueryMetadata; @@ -548,10 +549,18 @@ public abstract class AbstractSQLQuery> extends @Override public RT uniqueResult(Expression expr) { + if (getMetadata().getModifiers().getLimit() == null + && !expr.toString().contains("count(")){ + limit(2); + } CloseableIterator iterator = iterate(expr); try{ if (iterator.hasNext()){ - return iterator.next(); + RT rv = iterator.next(); + if (iterator.hasNext()){ + throw new NonUniqueResultException(); + } + return rv; }else{ return null; } diff --git a/querydsl-sql/src/test/java/com/mysema/query/BeanPopulationBaseTest.java b/querydsl-sql/src/test/java/com/mysema/query/BeanPopulationBaseTest.java index 4008c54a3..419fa090c 100644 --- a/querydsl-sql/src/test/java/com/mysema/query/BeanPopulationBaseTest.java +++ b/querydsl-sql/src/test/java/com/mysema/query/BeanPopulationBaseTest.java @@ -29,7 +29,7 @@ public abstract class BeanPopulationBaseTest extends AbstractBaseTest{ assertEquals(1l, update(e).populate(employee).where(e.id.eq(employee.getId())).execute()); // Query - Employee smith = query().from(e).where(e.lastname.eq("Smith")).uniqueResult(e); + Employee smith = query().from(e).where(e.lastname.eq("Smith")).limit(1).uniqueResult(e); assertEquals("John", smith.getFirstname()); // Delete (no changes needed) @@ -50,18 +50,21 @@ public abstract class BeanPopulationBaseTest extends AbstractBaseTest{ // Query Employee smith = extQuery().from(e).where(e.lastname.eq("Smith")) + .limit(1) .uniqueResult(Employee.class, e.lastname, e.firstname); assertEquals("John", smith.getFirstname()); assertEquals("Smith", smith.getLastname()); // Query with alias smith = extQuery().from(e).where(e.lastname.eq("Smith")) + .limit(1) .uniqueResult(Employee.class, e.lastname.as("lastname"), e.firstname.as("firstname")); assertEquals("John", smith.getFirstname()); assertEquals("Smith", smith.getLastname()); // Query into custom type OtherEmployee other = extQuery().from(e).where(e.lastname.eq("Smith")) + .limit(1) .uniqueResult(OtherEmployee.class, e.lastname, e.firstname); assertEquals("John", other.getFirstname()); assertEquals("Smith", other.getLastname()); diff --git a/querydsl-sql/src/test/java/com/mysema/query/SelectBaseTest.java b/querydsl-sql/src/test/java/com/mysema/query/SelectBaseTest.java index 0e320ec40..e87b6c1e8 100644 --- a/querydsl-sql/src/test/java/com/mysema/query/SelectBaseTest.java +++ b/querydsl-sql/src/test/java/com/mysema/query/SelectBaseTest.java @@ -807,7 +807,7 @@ public abstract class SelectBaseTest extends AbstractBaseTest{ @Test public void Unique_Constructor_Projection(){ // unique constructor projection - IdName idAndName = query().from(survey).uniqueResult(new QIdName(survey.id, survey.name)); + IdName idAndName = query().from(survey).limit(1).uniqueResult(new QIdName(survey.id, survey.name)); assertNotNull(idAndName); assertNotNull(idAndName.getId()); assertNotNull(idAndName.getName()); @@ -817,7 +817,7 @@ public abstract class SelectBaseTest extends AbstractBaseTest{ @Test public void Unique_Single(){ // unique single - String s = query().from(survey).uniqueResult(survey.name); + String s = query().from(survey).limit(1).uniqueResult(survey.name); assertNotNull(s); } @@ -825,13 +825,18 @@ public abstract class SelectBaseTest extends AbstractBaseTest{ @Test public void Unique_Wildcard(){ // unique wildcard - Object[] row = query().from(survey).uniqueResult(survey.all()); + Object[] row = query().from(survey).limit(1).uniqueResult(survey.all()); assertNotNull(row); assertEquals(2, row.length); assertNotNull(row[0]); assertNotNull(row[1]); } + + @Test(expected=NonUniqueResultException.class) + public void UniqueResultContract(){ + query().from(employee).uniqueResult(employee.all()); + } @Test public void Various() throws SQLException { @@ -872,7 +877,7 @@ public abstract class SelectBaseTest extends AbstractBaseTest{ @SkipForQuoted public void Wildcard_All() { expectedQuery = "select * from EMPLOYEE2 e"; - query().from(employee).uniqueResult(Wildcard.all); + query().from(employee).list(Wildcard.all); } @Test