2016-04-14 45 views
0

我想要搜索的数据库例如一些搜索我有三个文本框 姓,名和性别 如果我输入有 一些名字,有些姓氏,男我想搜索所有的人那个特定的名字和性别,并显示它,我该如何做到这一点? 注:我只是新的春天和刚刚开始学习的感谢Spring MVC的 - 使用帕拉姆

控制器:

@RequestMapping(value = "/student/search", method = RequestMethod.GET) 
    public String searchStudent(@Param("name") String name, @Param("type") String type, Map<String, Object> model) { 
    Map<String, String> params = new HashMap<String, String>(); 
    params.put("name", name); 
    params.put("type", gender); 
    model.put("students",studentRepository.findAll(StudentSpecification.search(params))); 
    return "/students/list"; 
    } 
} 

规格:

public static Specification<Student> search(final Map<String, String> params) { 
    return (root, query, criteriaBuilder) -> { 
     List<Predicate> predicates = new ArrayList<Predicate>(); 

     params.forEach((k, v) -> { 
     if (StringUtils.equals(k, "name")) { 
      if (StringUtils.isNotBlank(v)) { 
      Predicate hasFirstName = 
       criteriaBuilder.like(root.join("user").<String>get("firstName"), "%" + v + "%"); 
      Predicate hasLastName = 
       criteriaBuilder.like(root.join("user").<String>get("lastName"), "%" + v + "%"); 
      predicates.add(criteriaBuilder.or(hasFirstName, hasLastName)); 
      } 
     } 
     }); 

     return criteriaBuilder.and(predicates.toArray(new Predicate[] {})); 
    }; 

    } 

} 

回答

0

你可以做到这一点使用@Query,在存储库中添加方法:

@Query("SELECT e FROM STUDENT e WHERE e.name = ?1 AND e.type = ?2") 
public List<student> findAll(String name, String type); 

在控制器中使用该方法:

@RequestMapping(value = "/student/search", method = RequestMethod.GET) 
public String searchStudent(@Param("name") String name, @Param("type") String type, Map<String, Object> model) { 
     model.put("students",studentRepository.findAll(name, type)); 
     return "/students/list"; 
} 
2

我从你的代码中假设你正在使用Spring数据jpa和规范,对不对? 如果是这样,你需要生成实体的元模型,如果你正在使用maven添加下面的代码,这会为你做它

 <plugin> 
      <groupId>org.bsc.maven</groupId> 
      <artifactId>maven-processor-plugin</artifactId> 
      <version>2.0.5</version> 
      <executions> 
       <execution> 
        <id>process</id> 
        <goals> 
         <goal>process</goal> 
        </goals> 
        <phase>generate-sources</phase> 
        <configuration> 
         <processors> 
          <processor>org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor</processor> 
         </processors> 
        </configuration> 
       </execution> 
      </executions> 
      <dependencies> 
       <dependency> 
        <groupId>org.hibernate</groupId> 
        <artifactId>hibernate-jpamodelgen</artifactId> 
        <version>4.3.6.Final</version> 
       </dependency> 
      </dependencies> 
     </plugin> 

我想你有一个名为学生的实体,这个插件声明将生成带有下划线“Student_”

后缀一个CLASSE,然后你可以实现的规范接口,这样

public class StudentSpecification { 

    public static Specification<Student> search(final Map<String, String> params) { 

     return new Specification<Student>() { 
      @Override 
      public Predicate toPredicate(Root<Student> studentRoot, CriteriaQuery<?> query, CriteriaBuilder cb) { 
      Predicate res = null; 


      if(params.containKey("name")) 
      res = cb.equal(studentRoot.get(Student_.name), params.get("name")); 

      if(params.containKey("type")) 
       if(res ==null) 
        res = cb.equal(studentRoot.get(Student_.name), params.get("type")); 
       else 
        res = cb.and(res, cb.equal(studentRoot.get(Student_.name), params.get("type"))); 

      return res; 
     } 

    } 
} 

,当然你StudentRepository类应该扩展JpaSpecificationExecuto东西r,像这样

interface StudentRepository extends JpaSpecificationExecutor<Student> { 
} 
+0

谢谢我试着在规范中使用另一个代码,但它不工作,你能帮我吗?请参阅编辑 –

+0

什么不适合你?你能发布“用户”和“学生”实体之间的映射吗? – Awnen