[topia] branch feature/orderBy created (now c6d0782)
This is an automated email from the git hooks/post-receive script. New change to branch feature/orderBy in repository topia. See http://git.nuiton.org/topia.git at c6d0782 refs #3508 TopiaJpaSupport#find(...) now fails if no order is specified This branch includes the following new commits: new c6337c0 refs #3508 findPage(...) should fail if no 'order by' is specified new c6d0782 refs #3508 TopiaJpaSupport#find(...) now fails if no order is specified The 2 revisions listed above as "new" are entirely new to this repository and will be described in separate emails. The revisions listed as "adds" were already present in the repository and have only been added to this reference. Detailed log of new commits: commit c6d078244d6fc5f732a1001acce8f7bd890904c9 Author: Arnaud Thimel <thimel@codelutin.com> Date: Fri Sep 12 11:59:31 2014 +0200 refs #3508 TopiaJpaSupport#find(...) now fails if no order is specified commit c6337c005da47a93a07b41bb923f81204de81377 Author: Arnaud Thimel <thimel@codelutin.com> Date: Thu Sep 11 18:04:27 2014 +0200 refs #3508 findPage(...) should fail if no 'order by' is specified -- To stop receiving notification emails like this one, please contact nuiton.org SCM administrator <admin+scm@nuiton.org>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/orderBy in repository topia. See http://git.nuiton.org/topia.git commit c6337c005da47a93a07b41bb923f81204de81377 Author: Arnaud Thimel <thimel@codelutin.com> Date: Thu Sep 11 18:04:27 2014 +0200 refs #3508 findPage(...) should fail if no 'order by' is specified --- .../it/legacy/evo3396/FetchPropertiesTest.java | 3 +- .../topia/persistence/internal/TopiaDaoTest.java | 33 ++++++++++++++-------- .../persistence/QueryMissingOrderException.java | 13 +++++++++ .../persistence/internal/AbstractTopiaDao.java | 25 +++++++++++----- 4 files changed, 55 insertions(+), 19 deletions(-) diff --git a/topia-it/src/test/java/org/nuiton/topia/it/legacy/evo3396/FetchPropertiesTest.java b/topia-it/src/test/java/org/nuiton/topia/it/legacy/evo3396/FetchPropertiesTest.java index a34b032..7eafb1c 100644 --- a/topia-it/src/test/java/org/nuiton/topia/it/legacy/evo3396/FetchPropertiesTest.java +++ b/topia-it/src/test/java/org/nuiton/topia/it/legacy/evo3396/FetchPropertiesTest.java @@ -275,7 +275,7 @@ public class FetchPropertiesTest extends AbstractLegacyTest { PaginationResult<Company> companies = companyDao .forNameIn(Arrays.asList("Code Lutin", "Cogitec")) .addFetch(Company.PROPERTY_DEPARTMENT) - .findPage(PaginationParameter.of(0, 1)); + .findPage(PaginationParameter.of(0, 1, Company.PROPERTY_NAME, false)); Assert.assertEquals(2, companies.getCount()); Assert.assertEquals(2, companies.getPageCount()); @@ -382,6 +382,7 @@ public class FetchPropertiesTest extends AbstractLegacyTest { PaginationResult<Company> companies = companyDao .forNameEquals("azetryu") .addFetch(Company.PROPERTY_DEPARTMENT) + .setOrderByArguments(Company.PROPERTY_NAME) .findPage(PaginationParameter.of(0, 5)); Assert.assertEquals(0, companies.getCount()); diff --git a/topia-it/src/test/java/org/nuiton/topia/persistence/internal/TopiaDaoTest.java b/topia-it/src/test/java/org/nuiton/topia/persistence/internal/TopiaDaoTest.java index 127679c..32d9387 100644 --- a/topia-it/src/test/java/org/nuiton/topia/persistence/internal/TopiaDaoTest.java +++ b/topia-it/src/test/java/org/nuiton/topia/persistence/internal/TopiaDaoTest.java @@ -38,6 +38,7 @@ import org.nuiton.topia.it.legacy.TopiaItLegacyDatabase; import org.nuiton.topia.it.legacy.TopiaItLegacyTopiaPersistenceContext; import org.nuiton.topia.it.legacy.test.entities.Person; import org.nuiton.topia.it.legacy.test.entities.PersonTopiaDao; +import org.nuiton.topia.persistence.QueryMissingOrderException; import org.nuiton.topia.persistence.TopiaDao; import org.nuiton.topia.persistence.TopiaEntities; import org.nuiton.topia.persistence.TopiaException; @@ -132,7 +133,7 @@ public class TopiaDaoTest { String query = "SELECT DISTINCT " + Person.PROPERTY_NAME + " " + - dao.newFromClause() + " ORDER BY " + Person.PROPERTY_NAME; + dao.newFromClause() + " ORDER BY " + Person.PROPERTY_NAME; Iterable<String> names = dao.findAllLazy(query, new HashMap<String, Object>()); Assert.assertEquals(5, Iterables.size(names)); } @@ -161,7 +162,7 @@ public class TopiaDaoTest { String query = "SELECT " + Person.PROPERTY_NAME + " " + - dao.newFromClause() + " ORDER BY " + Person.PROPERTY_NAME; + dao.newFromClause() + " ORDER BY " + Person.PROPERTY_NAME; PaginationResult<Person> pager = dao.initPagination(query, new HashMap<String, Object>(), 3); Assert.assertEquals(10, pager.getCount()); @@ -182,7 +183,7 @@ public class TopiaDaoTest { String query = "SELECT " + Person.PROPERTY_NAME + ", " + Person.PROPERTY_FIRSTNAME + " " + - dao.newFromClause() + " ORDER BY " + Person.PROPERTY_NAME; + dao.newFromClause() + " ORDER BY " + Person.PROPERTY_NAME; Iterable<String[]> names = dao.findAllLazy(query, new HashMap<String, Object>()); Assert.assertEquals(10, Iterables.size(names)); @@ -193,7 +194,7 @@ public class TopiaDaoTest { String query = "SELECT DISTINCT (" + Person.PROPERTY_NAME + ") " + - dao.newFromClause() + " ORDER BY " + Person.PROPERTY_NAME; + dao.newFromClause() + " ORDER BY " + Person.PROPERTY_NAME; dao.initPagination(query, new HashMap<String, Object>(), 3); } @@ -350,14 +351,14 @@ public class TopiaDaoTest { Assert.assertEquals(17, excepted.size()); { - PaginationParameter page = PaginationParameter.of(0, -1); + PaginationParameter page = PaginationParameter.of(0, -1, Person.PROPERTY_TOPIA_ID, false); List<Person> list = dao.find(dao.newFromClause(), new HashMap<String, Object>(), page); Assert.assertEquals(17, list.size()); } Set<String> alreadyLoaded = Sets.newHashSet(); { - PaginationParameter page = PaginationParameter.of(0, 6); + PaginationParameter page = PaginationParameter.of(0, 6, Person.PROPERTY_TOPIA_ID, false); List<Person> list = dao.find(dao.newFromClause(), new HashMap<String, Object>(), page); Assert.assertEquals(6, list.size()); @@ -368,7 +369,7 @@ public class TopiaDaoTest { } { - PaginationParameter page = PaginationParameter.of(1, 6); + PaginationParameter page = PaginationParameter.of(1, 6, Person.PROPERTY_TOPIA_ID, false); List<Person> list = dao.find(dao.newFromClause(), new HashMap<String, Object>(), page); Assert.assertEquals(6, list.size()); @@ -379,7 +380,7 @@ public class TopiaDaoTest { } { - PaginationParameter page = PaginationParameter.of(2, 6); + PaginationParameter page = PaginationParameter.of(2, 6, Person.PROPERTY_TOPIA_ID, false); List<Person> list = dao.find(dao.newFromClause(), new HashMap<String, Object>(), page); Assert.assertEquals(5, list.size()); @@ -445,7 +446,7 @@ public class TopiaDaoTest { createPersons(19); - String hql = dao.newFromClause("p") + " WHERE p." + Person.PROPERTY_NAME + " LIKE 'toto%' "; + String hql = dao.newFromClause("p") + " WHERE p." + Person.PROPERTY_NAME + " LIKE 'toto%' ORDER BY id "; PaginationResult<Person> page = dao.forHql(hql).findPage(PaginationParameter.of(0, 5)); Assert.assertEquals(5, page.getElements().size()); @@ -541,7 +542,7 @@ public class TopiaDaoTest { public void testFindPageNoData() throws TopiaException { String hql = dao.newFromClause("p"); - PaginationResult<Person> page = dao.forHql(hql).findPage(PaginationParameter.of(0, 5)); + PaginationResult<Person> page = dao.forHql(hql).findPage(PaginationParameter.of(0, 5, Person.PROPERTY_NAME, false)); Assert.assertEquals(0, page.getElements().size()); Assert.assertEquals(0, page.getCount()); @@ -550,4 +551,14 @@ public class TopiaDaoTest { } -} + + @Test (expected = QueryMissingOrderException.class) + public void testFindPageNoOrder() throws TopiaException { + + String hql = dao.newFromClause("p"); + PaginationParameter page = PaginationParameter.of(0, 5); + dao.forHql(hql).findPage(page); + + } + +} \ No newline at end of file diff --git a/topia-persistence/src/main/java/org/nuiton/topia/persistence/QueryMissingOrderException.java b/topia-persistence/src/main/java/org/nuiton/topia/persistence/QueryMissingOrderException.java index 8d58a30..b6a4bb8 100644 --- a/topia-persistence/src/main/java/org/nuiton/topia/persistence/QueryMissingOrderException.java +++ b/topia-persistence/src/main/java/org/nuiton/topia/persistence/QueryMissingOrderException.java @@ -26,6 +26,8 @@ package org.nuiton.topia.persistence; import java.util.Map; +import org.nuiton.util.pagination.PaginationParameter; + /** * If you get this exception, it means that you asked ToPIA to make an operation that needs a deterministic way to sort * the result but you didn't defined such query. @@ -42,8 +44,19 @@ public class QueryMissingOrderException extends TopiaQueryException { protected static final String MESSAGE = "Given query needs an ORDER BY clause since the API call you're using " + "needs the results sorting to be deterministic"; + protected PaginationParameter paginationParameter; + public QueryMissingOrderException(String hql, Map<String, Object> hqlParameters) { super(MESSAGE, hql, hqlParameters); } + public QueryMissingOrderException(String hql, Map<String, Object> hqlParameters, PaginationParameter paginationParameter) { + super(MESSAGE, hql, hqlParameters); + this.paginationParameter = paginationParameter; + } + + public PaginationParameter getPaginationParameter() { + return paginationParameter; + } + } diff --git a/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/AbstractTopiaDao.java b/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/AbstractTopiaDao.java index 3d4a074..1265347 100644 --- a/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/AbstractTopiaDao.java +++ b/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/AbstractTopiaDao.java @@ -581,12 +581,23 @@ public abstract class AbstractTopiaDao<E extends TopiaEntity> implements TopiaDa Preconditions.checkNotNull(hqlParameters); Preconditions.checkNotNull(page); - if (!page.getOrderClauses().isEmpty()) { + boolean hqlContainsOrderClause = hqlContainsOrderBy(hql); + boolean pageContainsOrderClause = !page.getOrderClauses().isEmpty(); - // can't have a order by clause in hql query - Preconditions.checkState( - !hqlContainsOrderBy(hql), - "An 'order by' clause was already found in hql, can't use the order of the pager"); + if (!hqlContainsOrderClause && !pageContainsOrderClause) { + throw new QueryMissingOrderException(hql, hqlParameters, page); + } + + // Must have one (and only one) order by clause in query + Preconditions.checkArgument( + hqlContainsOrderClause ^ pageContainsOrderClause, + String.format( + "One 'order by' clause (and only one) must be specified. [orderByInHql=%b] [orderByInPage=%b]", + hqlContainsOrderClause, + pageContainsOrderClause) + ); + + if (pageContainsOrderClause) { hql += " ORDER BY "; Iterable<String> orderClauses = Iterables.transform(page.getOrderClauses(), PAGINATION_ORDER_TO_HQL); @@ -595,8 +606,8 @@ public abstract class AbstractTopiaDao<E extends TopiaEntity> implements TopiaDa List<O> result = topiaJpaSupport.find( hql, - (int) page.getStartIndex(), - (int) page.getEndIndex(), + page.getStartIndex(), + page.getEndIndex(), hqlParameters); return result; -- To stop receiving notification emails like this one, please contact nuiton.org SCM administrator <admin+scm@nuiton.org>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/orderBy in repository topia. See http://git.nuiton.org/topia.git commit c6d078244d6fc5f732a1001acce8f7bd890904c9 Author: Arnaud Thimel <thimel@codelutin.com> Date: Fri Sep 12 11:59:31 2014 +0200 refs #3508 TopiaJpaSupport#find(...) now fails if no order is specified --- .../topia/it/legacy/TopiaJpaSupportTest.java | 39 ++++++++++---------- .../persistence/internal/AbstractTopiaDao.java | 18 ++++------ .../internal/support/HibernateTopiaJpaSupport.java | 42 ++++++++++++++++++---- .../topia/persistence/support/TopiaJpaSupport.java | 22 ++++++++++-- 4 files changed, 82 insertions(+), 39 deletions(-) diff --git a/topia-it/src/test/java/org/nuiton/topia/it/legacy/TopiaJpaSupportTest.java b/topia-it/src/test/java/org/nuiton/topia/it/legacy/TopiaJpaSupportTest.java index 9021436..48250df 100644 --- a/topia-it/src/test/java/org/nuiton/topia/it/legacy/TopiaJpaSupportTest.java +++ b/topia-it/src/test/java/org/nuiton/topia/it/legacy/TopiaJpaSupportTest.java @@ -59,9 +59,9 @@ public class TopiaJpaSupportTest { protected TopiaJpaSupport jpaSupport; - protected AddressTopiaDao addressDAO; + protected AddressTopiaDao addressDao; - protected PersonneTopiaDao personneDAO; + protected PersonneTopiaDao personneDao; protected Address address; @@ -72,19 +72,19 @@ public class TopiaJpaSupportTest { Field field = FieldUtils.getField(AbstractTopiaPersistenceContext.class, "jpaSupport", true); jpaSupport = (TopiaJpaSupport) field.get(persistenceContext); - personneDAO = persistenceContext.getPersonneDao(); - addressDAO = persistenceContext.getAddressDao(); + personneDao = persistenceContext.getPersonneDao(); + addressDao = persistenceContext.getAddressDao(); - address = addressDAO.create( + address = addressDao.create( Address.PROPERTY_ADRESS, "17 rue de la Pote Gellée, 44200 NANTES"); - personneDAO.create( + personneDao.create( Personne.PROPERTY_NAME, "Arnaud", Personne.PROPERTY_GENDER, Gender.MALE); - personneDAO.create( + personneDao.create( Personne.PROPERTY_NAME, "Charlotte", Personne.PROPERTY_GENDER, Gender.FEMALE); - personneDAO.create( + personneDao.create( Personne.PROPERTY_NAME, "Hortense", Personne.PROPERTY_GENDER, Gender.FEMALE); persistenceContext.commit(); @@ -92,19 +92,19 @@ public class TopiaJpaSupportTest { @Test public void testFindDAO() throws TopiaException { - Assert.assertEquals(3, personneDAO.count()); + Assert.assertEquals(3, personneDao.count()); - Assert.assertEquals(2, personneDAO.forGenderEquals(Gender.FEMALE).count()); - Assert.assertNotNull(personneDAO.forGenderEquals(Gender.FEMALE).findAnyOrNull()); - Assert.assertNotNull(personneDAO.forGenderEquals(Gender.MALE).findAnyOrNull()); - Assert.assertNull(personneDAO.forGenderEquals(null).findAnyOrNull()); + Assert.assertEquals(2, personneDao.forGenderEquals(Gender.FEMALE).count()); + Assert.assertNotNull(personneDao.forGenderEquals(Gender.FEMALE).findAnyOrNull()); + Assert.assertNotNull(personneDao.forGenderEquals(Gender.MALE).findAnyOrNull()); + Assert.assertNull(personneDao.forGenderEquals(null).findAnyOrNull()); - Assert.assertEquals(0, personneDAO.forNameEquals("nobody").count()); + Assert.assertEquals(0, personneDao.forNameEquals("nobody").count()); } @Test public void testFindAll() throws TopiaException { - Assert.assertEquals(3, personneDAO.count()); + Assert.assertEquals(3, personneDao.count()); String query = "from " + Personne.class.getName() + " where " + Personne.PROPERTY_GENDER + "=:g"; @@ -132,10 +132,11 @@ public class TopiaJpaSupportTest { @Test public void testFind() throws TopiaException { - Assert.assertEquals(3, personneDAO.count()); + Assert.assertEquals(3, personneDao.count()); String query = "from " + Personne.class.getName() + - " where " + Personne.PROPERTY_GENDER + "=:g"; + " where " + Personne.PROPERTY_GENDER + "=:g" + + " order by id "; Map<String, Object> args = Maps.newHashMap(); @@ -160,7 +161,7 @@ public class TopiaJpaSupportTest { @Test public void testFindUnique() throws TopiaException { - Assert.assertEquals(3, personneDAO.count()); + Assert.assertEquals(3, personneDao.count()); String query = "from " + Personne.class.getName() + " where " + Personne.PROPERTY_GENDER + "=:g"; @@ -179,7 +180,7 @@ public class TopiaJpaSupportTest { @Test(expected = TopiaException.class) public void testFindUniqueOutOfBounds() throws TopiaException { - Assert.assertEquals(3, personneDAO.count()); + Assert.assertEquals(3, personneDao.count()); String query = "from " + Personne.class.getName() + " where " + Personne.PROPERTY_GENDER + "=:g"; diff --git a/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/AbstractTopiaDao.java b/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/AbstractTopiaDao.java index 1265347..4071931 100644 --- a/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/AbstractTopiaDao.java +++ b/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/AbstractTopiaDao.java @@ -461,8 +461,9 @@ public abstract class AbstractTopiaDao<E extends TopiaEntity> implements TopiaDa } protected boolean exists(String hql, Map<String, Object> hqlParameters) { - List<E> entities = topiaJpaSupport.find(hql, 0, 0, hqlParameters); - boolean result = !entities.isEmpty(); + // TODO AThimel 12/09/14 Avoid loading entity, just count the results + E entity = topiaJpaSupport.findAny(hql, hqlParameters); + boolean result = entity != null; return result; } @@ -487,13 +488,9 @@ public abstract class AbstractTopiaDao<E extends TopiaEntity> implements TopiaDa } protected <O> O findUniqueOrNull(String hql, Map<String, Object> hqlParameters) throws TopiaNonUniqueResultException { - List<O> results = find(hql, hqlParameters, 0, 1); - // If there is more than 1 result, throw an exception - if (results.size() > 1) { - throw new TopiaNonUniqueResultException(hql, hqlParameters); - } - // otherwise return the first one, or null - O result = Iterables.getOnlyElement(results, null); + Preconditions.checkNotNull(hql); + Preconditions.checkNotNull(hqlParameters); + O result = topiaJpaSupport.findUnique(hql, hqlParameters); return result; } @@ -543,8 +540,7 @@ public abstract class AbstractTopiaDao<E extends TopiaEntity> implements TopiaDa protected <O> O findAnyOrNull(String hql, Map<String, Object> hqlParameters) { Preconditions.checkNotNull(hql); Preconditions.checkNotNull(hqlParameters); - List<O> results = find(hql, hqlParameters, 0, 0); - O result = Iterables.getOnlyElement(results, null); + O result = topiaJpaSupport.findAny(hql, hqlParameters); return result; } diff --git a/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/support/HibernateTopiaJpaSupport.java b/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/support/HibernateTopiaJpaSupport.java index d024c5a..d2b79d7 100644 --- a/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/support/HibernateTopiaJpaSupport.java +++ b/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/support/HibernateTopiaJpaSupport.java @@ -25,13 +25,17 @@ package org.nuiton.topia.persistence.internal.support; */ import com.google.common.base.Preconditions; +import com.google.common.collect.Iterables; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.hibernate.FlushMode; import org.hibernate.HibernateException; import org.hibernate.Query; import org.hibernate.loader.MultipleBagFetchException; +import org.nuiton.topia.persistence.QueryMissingOrderException; import org.nuiton.topia.persistence.TopiaException; +import org.nuiton.topia.persistence.TopiaNonUniqueResultException; import org.nuiton.topia.persistence.TopiaQueryException; import org.nuiton.topia.persistence.support.TopiaHibernateSupport; import org.nuiton.topia.persistence.support.TopiaJpaSupport; @@ -147,28 +151,52 @@ public class HibernateTopiaJpaSupport implements TopiaJpaSupport { } @Override + public <T> T findAny(String jpaql, Map<String, Object> parameters) { + + // Execute query, and ask for one result only + List<T> results = find0(jpaql, 0, 0, parameters); + + // Return it or null + T result = Iterables.getOnlyElement(results, null); + return result; + } + + @Override public <T> T findUnique(String jpaql, Map<String, Object> parameters) { // Execute query, and ask for up to 2 results only - List<T> results = find(jpaql, 0, 1, parameters); + List<T> results = find0(jpaql, 0, 1, parameters); // If there is more than 1 result, throw an exception if (results.size() > 1) { String message = String.format( "Query '%s' returns more than 1 unique result", jpaql); - throw new TopiaException(message); + throw new TopiaNonUniqueResultException(message, parameters); } // otherwise return the first one, or null - T result = null; - if (!results.isEmpty()) { - result = results.get(0); - } + T result = Iterables.getOnlyElement(results, null); return result; } + // FIXME AThimel 11/09/14 This method duplicates org.nuiton.topia.persistence.internal.AbstractTopiaDao.hqlContainsOrderBy() + protected boolean hqlContainsOrderBy(String hql) { + return hql.toLowerCase().contains("order by"); + } + @Override - public <T> List<T> find(String jpaql, int startIndex, int endIndex, Map<String, Object> parameters) { + public <T> List<T> find(String jpaql, int startIndex, int endIndex, Map<String, Object> parameters) + throws QueryMissingOrderException { + + if (!hqlContainsOrderBy(jpaql)) { + throw new QueryMissingOrderException(jpaql, parameters); + } + + List<T> result = find0(jpaql, startIndex, endIndex, parameters); + return result; + } + + protected <T> List<T> find0(String jpaql, int startIndex, int endIndex, Map<String, Object> parameters) { try { Query query = prepareQuery(jpaql, parameters); diff --git a/topia-persistence/src/main/java/org/nuiton/topia/persistence/support/TopiaJpaSupport.java b/topia-persistence/src/main/java/org/nuiton/topia/persistence/support/TopiaJpaSupport.java index 26f2f9b..eacea98 100644 --- a/topia-persistence/src/main/java/org/nuiton/topia/persistence/support/TopiaJpaSupport.java +++ b/topia-persistence/src/main/java/org/nuiton/topia/persistence/support/TopiaJpaSupport.java @@ -27,6 +27,8 @@ package org.nuiton.topia.persistence.support; import java.util.List; import java.util.Map; +import org.nuiton.topia.persistence.QueryMissingOrderException; + /** * This API provides methods to use persistence using JPA queries * @@ -62,14 +64,30 @@ public interface TopiaJpaSupport { * @param endIndex last index of entity to return * @param parameters a map which keys are the attribute names and values are the attributes expected values * @return The result list + * @throws QueryMissingOrderException if no order by clause is specified */ <T> List<T> find(String jpaql, int startIndex, int endIndex, - Map<String, Object> parameters); + Map<String, Object> parameters) + throws QueryMissingOrderException; + + /** + * Allow to do some JPA-QL query and return a single result. If nothing is + * found by the query, will return null. + * <p/> + * WARNING : Depending on the registered service, this method may not + * support something else than queries on TopiaEntity + * + * @param jpaql the JPA-QL query + * @param parameters a map which keys are the attribute names and values are the attributes expected values + * @return The result instance or null + */ + <T> T findAny(String jpaql, + Map<String, Object> parameters); /** - * Allow to do some JPA-QL query and return an unique result. If nothing if + * Allow to do some JPA-QL query and return an unique result. If nothing is * found by the query, will return null. If more than one result is found, * will throw an exception. * <p/> -- To stop receiving notification emails like this one, please contact nuiton.org SCM administrator <admin+scm@nuiton.org>.
participants (1)
-
nuiton.org scm