From c434cf02e55c856ae89943f5837f96f5827fa5aa Mon Sep 17 00:00:00 2001 From: Calvin Date: Wed, 12 Sep 2012 00:32:21 +0800 Subject: [PATCH] =?UTF-8?q?#86=20=E5=BC=80=E5=A7=8B=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?=E5=8A=A8=E6=80=81=E6=90=9C=E7=B4=A2=E6=9D=A1=E4=BB=B6=E7=BB=84?= =?UTF-8?q?=E5=90=88=E7=9A=84=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LICENSE.txt | 2 +- examples/quickstart/bin/package.bat | 2 +- examples/quickstart/pom.xml | 1 - .../quickstart/repository/TaskDao.java | 3 +- .../src/main/resources/applicationContext.xml | 1 + .../quickstart/repository/TaskDaoTest.java | 23 +++++++++ examples/showcase/bin/package.bat | 2 +- .../persistence/ByWebFilterSpecification.java | 48 +++++++++++++++++++ .../modules/persistence/SearchFilter.java | 20 ++++++++ 9 files changed, 97 insertions(+), 5 deletions(-) create mode 100644 modules/core/src/main/java/org/springside/modules/persistence/ByWebFilterSpecification.java create mode 100644 modules/core/src/main/java/org/springside/modules/persistence/SearchFilter.java diff --git a/LICENSE.txt b/LICENSE.txt index 6d3963fe..d240b9cc 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -186,7 +186,7 @@ same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright [2006-2007] [www.springside.org.cn] + Copyright [2006-2012] [www.springside.org.cn] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/examples/quickstart/bin/package.bat b/examples/quickstart/bin/package.bat index 69c38b1b..a9b5ddba 100644 --- a/examples/quickstart/bin/package.bat +++ b/examples/quickstart/bin/package.bat @@ -3,6 +3,6 @@ echo [INFO] Package the war in target dir. cd %~dp0 cd .. -call mvn package -Dmaven.test.skip=true +call mvn clean package -Dmaven.test.skip=true cd bin pause \ No newline at end of file diff --git a/examples/quickstart/pom.xml b/examples/quickstart/pom.xml index 1973a49d..6ec6a291 100644 --- a/examples/quickstart/pom.xml +++ b/examples/quickstart/pom.xml @@ -431,7 +431,6 @@ - ${project.basedir}/src/main/java2 diff --git a/examples/quickstart/src/main/java/org/springside/examples/quickstart/repository/TaskDao.java b/examples/quickstart/src/main/java/org/springside/examples/quickstart/repository/TaskDao.java index bea048e5..e1569c90 100644 --- a/examples/quickstart/src/main/java/org/springside/examples/quickstart/repository/TaskDao.java +++ b/examples/quickstart/src/main/java/org/springside/examples/quickstart/repository/TaskDao.java @@ -2,12 +2,13 @@ package org.springside.examples.quickstart.repository; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.PagingAndSortingRepository; import org.springside.examples.quickstart.entity.Task; -public interface TaskDao extends PagingAndSortingRepository { +public interface TaskDao extends PagingAndSortingRepository, JpaSpecificationExecutor { Page findByUserId(Long id, Pageable pageRequest); diff --git a/examples/quickstart/src/main/resources/applicationContext.xml b/examples/quickstart/src/main/resources/applicationContext.xml index d53b92b3..42b63dc7 100644 --- a/examples/quickstart/src/main/resources/applicationContext.xml +++ b/examples/quickstart/src/main/resources/applicationContext.xml @@ -42,6 +42,7 @@ + diff --git a/examples/quickstart/src/test/java/org/springside/examples/quickstart/repository/TaskDaoTest.java b/examples/quickstart/src/test/java/org/springside/examples/quickstart/repository/TaskDaoTest.java index 1f74c9b8..3b729702 100644 --- a/examples/quickstart/src/test/java/org/springside/examples/quickstart/repository/TaskDaoTest.java +++ b/examples/quickstart/src/test/java/org/springside/examples/quickstart/repository/TaskDaoTest.java @@ -2,6 +2,8 @@ package org.springside.examples.quickstart.repository; import static org.junit.Assert.*; +import java.util.List; + import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; @@ -9,14 +11,22 @@ import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Sort.Direction; import org.springframework.test.context.ContextConfiguration; import org.springside.examples.quickstart.entity.Task; +import org.springside.modules.persistence.ByWebFilterSpecification; +import org.springside.modules.persistence.SearchFilter; +import org.springside.modules.persistence.SearchFilter.Operator; import org.springside.modules.test.spring.SpringTransactionalTestCase; +import com.google.common.collect.Lists; + @ContextConfiguration(locations = { "/applicationContext.xml" }) public class TaskDaoTest extends SpringTransactionalTestCase { @Autowired private TaskDao taskDao; + @Autowired + private ByWebFilterSpecification spec; + @Test public void findTasksByUserId() throws Exception { Page tasks = taskDao.findByUserId(2L, new PageRequest(0, 100, Direction.ASC, "id")); @@ -26,4 +36,17 @@ public class TaskDaoTest extends SpringTransactionalTestCase { tasks = taskDao.findByUserId(99999L, new PageRequest(0, 100, Direction.ASC, "id")); assertEquals(0, tasks.getContent().size()); } + + @Test + public void fineTasksByFilter() { + SearchFilter filter = new SearchFilter("title", "Study PlayFramework 2.0", Operator.EQ); + + List tasks = taskDao.findAll(spec.byWebFilter(Lists.newArrayList(filter), Task.class)); + assertEquals(1, tasks.size()); + + filter = new SearchFilter("description", "playframework", Operator.LIKE); + tasks = taskDao.findAll(spec.byWebFilter(Lists.newArrayList(filter), Task.class)); + assertEquals(1, tasks.size()); + + } } diff --git a/examples/showcase/bin/package.bat b/examples/showcase/bin/package.bat index 69c38b1b..a9b5ddba 100644 --- a/examples/showcase/bin/package.bat +++ b/examples/showcase/bin/package.bat @@ -3,6 +3,6 @@ echo [INFO] Package the war in target dir. cd %~dp0 cd .. -call mvn package -Dmaven.test.skip=true +call mvn clean package -Dmaven.test.skip=true cd bin pause \ No newline at end of file diff --git a/modules/core/src/main/java/org/springside/modules/persistence/ByWebFilterSpecification.java b/modules/core/src/main/java/org/springside/modules/persistence/ByWebFilterSpecification.java new file mode 100644 index 00000000..36f30021 --- /dev/null +++ b/modules/core/src/main/java/org/springside/modules/persistence/ByWebFilterSpecification.java @@ -0,0 +1,48 @@ +package org.springside.modules.persistence; + +import java.util.List; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Expression; +import javax.persistence.criteria.Predicate; +import javax.persistence.criteria.Root; +import javax.persistence.metamodel.SingularAttribute; + +import org.springframework.data.jpa.domain.Specification; +import org.springside.modules.persistence.SearchFilter.Operator; + +import com.google.common.collect.Lists; + +public class ByWebFilterSpecification { + @PersistenceContext + private EntityManager entityManager; + + public Specification byWebFilter(final List filters, final Class clazz) { + return new Specification() { + @Override + public Predicate toPredicate(Root root, CriteriaQuery query, CriteriaBuilder builder) { + List predicates = Lists.newArrayList(); + for (SearchFilter filter : filters) { + SingularAttribute attr = entityManager.getMetamodel().entity(clazz) + .getDeclaredSingularAttribute(filter.fieldName); + if (filter.operator.equals(Operator.EQ)) { + predicates.add(builder.equal(root.get(attr), filter.value)); + } + if (filter.operator.equals(Operator.LIKE)) { + predicates.add(builder.like((Expression) root.get(attr), "%" + filter.value + "%")); + } + + } + + if (predicates.size() > 0) { + return builder.and(predicates.toArray(new Predicate[predicates.size()])); + } + + return builder.conjunction(); + } + }; + } +} diff --git a/modules/core/src/main/java/org/springside/modules/persistence/SearchFilter.java b/modules/core/src/main/java/org/springside/modules/persistence/SearchFilter.java new file mode 100644 index 00000000..35fbf4f4 --- /dev/null +++ b/modules/core/src/main/java/org/springside/modules/persistence/SearchFilter.java @@ -0,0 +1,20 @@ +package org.springside.modules.persistence; + +public class SearchFilter { + + public enum Operator { + EQ, LIKE + } + + public String fieldName; + public Object value; + public Operator operator; + + public SearchFilter(String fieldName, Object value, Operator operator) { + super(); + this.fieldName = fieldName; + this.value = value; + this.operator = operator; + } + +}