Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database Spring MVC-使用Param进行搜索_Database_Spring_Spring Mvc - Fatal编程技术网

Database Spring MVC-使用Param进行搜索

Database Spring MVC-使用Param进行搜索,database,spring,spring-mvc,Database,Spring,Spring Mvc,我想从数据库中搜索一些东西。例如,我有三个文本字段 名、姓和性别 如果我在那里输入 一些姓,一些姓,男性我想搜索所有具有特定姓名和性别的人,并显示出来我该怎么做? 注:我刚刚开始学习Spring,谢谢 控制器: @RequestMapping(value = "/student/search", method = RequestMethod.GET) public String searchStudent(@Param("name") String name, @Param("type"

我想从数据库中搜索一些东西。例如,我有三个文本字段 名、姓和性别 如果我在那里输入 一些姓,一些姓,男性我想搜索所有具有特定姓名和性别的人,并显示出来我该怎么做? 注:我刚刚开始学习Spring,谢谢

控制器:

  @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";
  }
}
@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";
}
@RequestMapping(value=“/student/search”,method=RequestMethod.GET)
公共字符串searchStudent(@Param(“name”)字符串名称,@Param(“type”)字符串类型,映射模型){
Map params=新的HashMap();
参数put(“名称”,名称);
参数put(“类型”,性别);
model.put(“学生”,studentRepository.findAll(StudentSpecification.search(params));
返回“/学生/名单”;
}
}
规格:

 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[] {}));
    };

  }

}
公共静态规范搜索(最终映射参数){
返回(根、查询、准则生成器)->{
列表谓词=新的ArrayList();
forEach参数((k,v)->{
if(StringUtils.equals(k,“name”)){
if(StringUtils.isNotBlank(v)){
谓词名=
criteriaBuilder.like(root.join(“user”).get(“firstName”),“%”+v+“%”;
谓词hasLastName=
criteriaBuilder.like(root.join(“user”).get(“lastName”),“%”+v+“%”;
add(criteriaBuilder.or(hasFirstName,hasLastName));
}
}
});
返回criteriaBuilder.and(predicates.toArray(新谓词[]{}));
};
}
}

您可以使用
@Query
在存储库中添加方法执行此操作:

@Query("SELECT e FROM STUDENT e WHERE e.name = ?1 AND e.type = ?2")
public List<student> findAll(String name, String type);
@Query(“从学生e中选择e,其中e.name=?1和e.type=?2”)
公共列表findAll(字符串名称、字符串类型);
在控制器中使用该方法:

  @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";
  }
}
@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";
}
@RequestMapping(value=“/student/search”,method=RequestMethod.GET)
公共字符串searchStudent(@Param(“name”)字符串名称,@Param(“type”)字符串类型,映射模型){
model.put(“学生”,studentRepository.findAll(名称、类型));
返回“/学生/名单”;
}

您可以使用
@Query
在存储库中添加方法执行此操作:

@Query("SELECT e FROM STUDENT e WHERE e.name = ?1 AND e.type = ?2")
public List<student> findAll(String name, String type);
@Query(“从学生e中选择e,其中e.name=?1和e.type=?2”)
公共列表findAll(字符串名称、字符串类型);
在控制器中使用该方法:

  @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";
  }
}
@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";
}
@RequestMapping(value=“/student/search”,method=RequestMethod.GET)
公共字符串searchStudent(@Param(“name”)字符串名称,@Param(“type”)字符串类型,映射模型){
model.put(“学生”,studentRepository.findAll(名称、类型));
返回“/学生/名单”;
}

我从您的代码中推测,您使用的是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> 

org.bsc.maven
maven处理器插件
2.0.5
过程
过程
生成源
org.hibernate.jpamodelgen.jpametamodelenticyprocessor
org.hibernate
冬眠
4.3.6.最终版本
我假设您有一个名为Student的实体,这个插件声明将生成一个带有下划线'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;
        }

    }
}
interface StudentRepository extends  JpaSpecificationExecutor<Student> {
 }
公共课堂学生规范{
公共静态规范搜索(最终映射参数){
返回新规范(){
@凌驾
公共谓词toPredicate(Root studentRoot、CriteriaQuery查询、CriteriaBuilder cb){
谓词res=null;
if(参数containKey(“名称”))
res=cb.equal(studentRoot.get(Student.name),params.get(“name”);
if(参数containKey(“类型”))
如果(res==null)
res=cb.equal(studentRoot.get(Student.name),params.get(“type”);
其他的
res=cb.and(res,cb.equal(studentRoot.get(Student.name),params.get(“type”));
返回res;
}
}
}
当然,您的StudentRepository类应该扩展JpaSpecificationExecutor,类似这样的

 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;
        }

    }
}
interface StudentRepository extends  JpaSpecificationExecutor<Student> {
 }
interface StudentRepository扩展了JpaSpecificationExecutor{
}

我从您的代码中推测,您使用的是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> 

org.bsc.maven
maven处理器插件
2.0.5
过程
过程
生成源
org.hibernate.jpamodelgen.jpametamodelenticyprocessor
org.hibernate
冬眠
4.3.6.最终版本
我假设您有一个名为Student的实体,这个插件声明将生成一个带有下划线'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;
        }

    }
}
interface StudentRepository extends  JpaSpecificationExecutor<Student> {
 }
公共课堂学生规范{
公共静态规范搜索(最终映射参数){
返回新规范(){
@凌驾
公共谓词toPredicate(Root studentRoot、CriteriaQuery查询、CriteriaBuilder cb){