2016-04-14 3 views
0

Я хочу найти что-то из примера базы данных у меня есть три текстовых поля Имя, Фамилия и Пол если я ввода там Некоторые Firstname, некоторые Lastname, Мужчина Я хочу найти всех людей с что определенное имя и пол и показать его, как мне это сделать? Примечание: Я просто новичок в Spring и только начал обучение благодаряSpring MVC - Поиск с использованием Param

Контроллер:

@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

Я полагаю из вашего кода, что вы используете данные весны 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 с суффиксом подчеркиванием «Student_»

, а затем вы можете реализовать интерфейс спецификации, что-то вроде этого

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

Что не работает именно для вас? можете ли вы опубликовать сопоставление между субъектами «user» и «student»? – Awnen

Смежные вопросы