r3132 - in trunk: topia-it/src/test/java/org/nuiton/topia/persistence/internal topia-persistence/src/main/java/org/nuiton/topia/persistence/internal
Author: athimel Date: 2014-05-23 12:29:45 +0200 (Fri, 23 May 2014) New Revision: 3132 Url: http://forge.nuiton.org/projects/topia/repository/revisions/3132 Log: refs #3208 Prevent exception when using findAllLazy together with a SELECT clause Modified: trunk/topia-it/src/test/java/org/nuiton/topia/persistence/internal/TopiaDaoTest.java trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/AbstractTopiaDao.java Modified: trunk/topia-it/src/test/java/org/nuiton/topia/persistence/internal/TopiaDaoTest.java =================================================================== --- trunk/topia-it/src/test/java/org/nuiton/topia/persistence/internal/TopiaDaoTest.java 2014-05-23 08:28:43 UTC (rev 3131) +++ trunk/topia-it/src/test/java/org/nuiton/topia/persistence/internal/TopiaDaoTest.java 2014-05-23 10:29:45 UTC (rev 3132) @@ -181,8 +181,27 @@ } @Test - public void iterateOnTopiaDAO() throws TopiaException { + public void findAllLazyWithSelect() throws TopiaException { + Assert.assertEquals(dao.count(), 0); + + createPersons(25); + + Map<String, Object> emptyArgs = Maps.newHashMap(); + + dao.setBatchSize(10); + + String hql = "SELECT DISTINCT(" + Person.PROPERTY_NAME + ") " + + "FROM " + dao.getTopiaEntityEnum().getImplementationFQN() + " " + + "ORDER BY " + Person.PROPERTY_NAME; + Iterable<String> allByLazy = dao.findAllLazy(hql, emptyArgs); + + Assert.assertEquals(25, Iterables.size(allByLazy)); + } + + @Test + public void iterateOnTopiaDao() throws TopiaException { + createPersons(1999); List<Person> excepted = dao.findAll(); Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/AbstractTopiaDao.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/AbstractTopiaDao.java 2014-05-23 08:28:43 UTC (rev 3131) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/AbstractTopiaDao.java 2014-05-23 10:29:45 UTC (rev 3132) @@ -209,12 +209,17 @@ PaginationParameter firstPage = PaginationParameter.of(0, pageSize); if (hqlContainsOrderBy(hql)) { - // must remove the order by clause, otherwise some sql queries won't work. hql = hql.substring(0, hql.toLowerCase().indexOf("order by")); } + + if (hqlStartsWithSelect(hql)) { + // must remove the select, otherwise some sql queries won't work. + hql = hql.substring(hql.toLowerCase().indexOf("from")); + } + long count = count("SELECT COUNT(*) " + hql, params); - List<E> emptyList = Lists.newArrayList(); // XXX AThimel 22/05/14 To keep the old behavior, we do not load the elements. Is it correct ? + List<E> emptyList = Lists.newArrayList(); // AThimel 22/05/14 To keep the old behavior, we do not load the elements PaginationResult<E> result = PaginationResult.of(emptyList, count, firstPage); return result; } @@ -686,6 +691,10 @@ return hql.toLowerCase().contains("order by"); } + protected boolean hqlStartsWithSelect(String hql) { + return hql.toLowerCase().trim().startsWith("select "); + } + protected boolean hqlContainsCount(String hql) { return hql.toLowerCase().contains("count("); } @@ -1077,7 +1086,7 @@ @Override public Iterable<E> findAllLazy() { - return topiaDAO.findAllLazy(hql +(fromHql?"":" ORDER BY id") , hqlParameters); + return topiaDAO.findAllLazy(hql + (fromHql ? "" : " ORDER BY id"), hqlParameters); } @Override
participants (1)
-
athimelï¼ users.nuiton.org