【问题标题】:How to search multiple fields in a search box in spring data jpa如何在spring data jpa的搜索框中搜索多个字段
【发布时间】:2018-07-25 19:30:45
【问题描述】:

我正在使用 spring data jpa 并正在编写一个搜索功能。在我的模型中包括名字和姓氏。我希望我的搜索对话框同时搜索名字和姓氏。例如,firstName 是 Alen,lastName 是 Lee,如果我在搜索框中输入的是 Alen 或 Lee,那么 spring 仍然会找到正确的值。有什么方法可以帮助我在 spring data jpa 中实现这一目标?

员工道

package com.baotrung.springcrudjpafull.dao;

import com.baotrung.springcrudjpafull.model.Employee;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface EmployeeDao extends CrudRepository<Employee,Integer> {
        Employee findAllByFirstNameAndLastName(String firstName,String lastName);
}

员工控制器

@RequestMapping(value = "/searchEmployee", method = RequestMethod.GET)
    public String getEmployeeByName(@RequestParam("firstName") String firstName, @RequestParam("lastName") String lastName, ModelMap modelMap) {
        Employee employee = servicesDao.findAllByFirstNameAndLastName(firstName,lastName);
        modelMap.addAttribute("employees", employee);
        return "Employee";
    }

但是在jsp中我不知道如何传递参数才能调用它。如果使用,只使用一个参数。那么如何在spring的搜索框中找到多个字段。请帮助

【问题讨论】:

  • 您的意思是,要搜索匹配姓氏“或”名字的记录?
  • 这个问题不太清楚。问题出在视图(JSP)还是道?
  • @Javvano 我想同时找到名字和姓氏。
  • @Leone 我认为两者都有问题。我写在repository 不知道是不是正确的,jsp 端我不知道怎么调用才能找到两者。抱歉问题不清楚

标签: java spring spring-mvc spring-boot spring-data-jpa


【解决方案1】:

看看这个:

在回购中:

@Repository
public interface EmployeeDao extends JpaRepository<Employee, Integer> {
    @Query("select e from Employee e where lower(e.firstName) like lower(concat('%', :search, '%')) " +
"or lower(e.lastName) like lower(concat('%', :search, '%'))")
    List<Employee> findByFirstNameOrLastName(@Param("search") String search);
}

在控制器中:

@RequestMapping("/searchEmployee", method = RequestMethod.GET)
    public String getEmployeeByName(@RequestParam(name = "search") String search, Model model) {
        Employee employee = servicesDao.findAllByFirstNameAndLastName(search);
        model.addAttribute("employees", employee);
        return "Employee";
    }

在jsp中应该和我在thymeleaf中做的一样:

<form action="#" th:action="@{search}" method="get" class="input-group">
    <input class="form-control form-control-dark" type="text" placeholder="Search" name="search" aria-label="Search">
    <div class="input-group-append">
        <button class="btn btn-outline-light" value="Search">Search</button>
    </div>
</form>

【讨论】:

    【解决方案2】:

    如果你想使用GET方法,参数应该是@PathVaraible而不是@RequestParam,你必须用/searchEmployee/Alen/Lee调用方法

    控制器应该是;

    @RequestMapping(value = "/searchEmployee/{firstname}/{lastname}", method = RequestMethod.GET)
        public String getEmployeeByName(@PathVariable("firstName") String firstName, @PathVariable("lastName") String lastName, ModelMap modelMap) {
            List<Employee> employee = servicesDao.findAllByFirstNameAndLastName(firstName,lastName);
            modelMap.addAttribute("employees", employee);
            return "employee";
        }
    

    如果您希望用户可以键入搜索值,您需要在 jsp 中创建一个 html 表单并提交您的表单 /searchEmployee uri 并且控制器应该是

    @RequestMapping(value = "/searchEmployee", method = RequestMethod.POST)
        public String getEmployeeByName(@RequestParam("firstName") String firstName, @RequestParam("lastName") String lastName, ModelMap modelMap) {
            List<Employee> employee = servicesDao.findAllByFirstNameAndLastName(firstName,lastName);
            modelMap.addAttribute("employees", employee);
            return "employee";
        }
    

    并且你的控制器方法应该是返回不带后缀的 jsp 文件名。例如。如果你的jsp文件名employee.jsp,方法应该是return "employee";

    我认为存储库应该是这样的;

    @Repository
    public interface EmployeeDao extends CrudRepository<Employee,Integer> {
            List<Employee> findAllByFirstNameAndLastName(String firstName,String lastName);
    }
    

    但这取决于您的员工数据模型。我的意思是,如果名字和姓氏都具有唯一约束,您也可以只返回 Employee 对象

    【讨论】:

    • 是的,谢谢我认为 Yuriy Tsarkov 的上述回答是正确的,但我不知道如何能够将 2 个以上的参数传递到 jsp 的搜索框中。如果使用 findAllByFirstNameAndLastName 它将不起作用。
    • 你对 sql where 子句的期望是什么?
    • 是的,@cagridursun 提出了非常直接的问题!你要实现的 sql 查询是什么?
    【解决方案3】:

    试试这个

    findAllByFirstNameLikeOrLastNameLike
    

    或者

    findAllByFirstNameContainingOrLastNameContaining
    

    第一个将产生一个带有like比较的请求,第二个将参数包装到%%

    【讨论】:

    • 谢谢。但是在jsp中,如果我创建一个表单搜索,我如何找到firstName和lastName。
    • 如果我的答案不是你要找的东西,我会同意其他人的看法——你的问题不清楚。对不起
    • 谢谢理解 我只是不知道在jsp中如何将搜索对话框传递给上面的2个参数
    猜你喜欢
    • 2018-07-13
    • 2018-08-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-20
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 2017-08-28
    相关资源
    最近更新 更多