Как искать, используя условие ИЛИ пружину jpa - PullRequest
0 голосов
/ 09 июня 2018

Я выполняю функцию поиска в MVC Spring.Я хочу сделать поиск как по имени, так и по фамилии.Если я введу строку в поле поиска и нажму клавишу ввода, я выполню поиск в firstName, если не найду ее, выполнив поиск в lastName и наоборот.Это означает, что я хочу ввести строку и выполнить поиск по всем полям.Вот содержимое моей программы.

Сотрудник:

@Entity
public class Employee implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private String firstName;
    private String lastName;
    private int age;
    private double salary;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }
}

Репозиторий:

@Repository
public interface EmployeeDAO extends  JpaRepository<Employee,Integer>{
    List<Employee> findEmployeeByFirstNameOrLastName(String searchName);

}

Контроллер:

@RequestMapping(value = "/search")
    public ModelAndView searchByFirstName(@RequestParam String searchName) {
        ModelAndView view = new ModelAndView("showEmployee");
        return view;
    }

Вид:

 <div class="row">
        <form method="get" action="/search">
            <div class="small-3 columns">
                <input type="text" id ="txt" name="searchName" >
            </div>

            <div class="small-5 columns end">
                <button id="button-id" type="submit">Search</button>
            </div>
        </form>
    </div>

Я запустился, но он не может найти ни firstName, ни LastName.Как два ищут как firstName, так и lastName с одним параметром

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Производные запросы Spring Data полезны, однако зачастую проще и понятнее просто указать запрос:

@Repository
public interface EmployeeDAO extends  JpaRepository<Employee,Integer>{

    @Query("select e from Employee e where e.firstName = :searchName 
               or e.lastName = :searchName)
    List<Employee> findEmployeeByFirstNameOrLastName(
             @Param("searchName") String searchName);

}
0 голосов
/ 09 июня 2018

Вам необходимо указать два поля:

List<Employee> findEmployeeByFirstNameOrLastName(String firstName, String lastName);

Затем назовите его:

findEmployeeByFirstNameOrLastName("searchName", "searchName");

Чтобы получить Employee, чей firstName или lastName равен "searchName"

Окончательный код выглядит следующим образом:

@Repository
public interface EmployeeDAO extends  JpaRepository<Employee,Integer>{
    List<Employee> findEmployeeByFirstNameOrLastName(String firstName, String lastName);

}


@RequestMapping(value = "/search")
public ModelAndView searchByFirstName(@RequestParam String searchName) {
    ModelAndView view = new ModelAndView("showEmployee");
    // Access employeeDAO here, or use employeeService if you using service
    List<Employee> employees = employeeDao.findEmployeeByFirstNameOrLastName(searchName, searchName);
    view.addObject("employees", employees);
    return view;
}

В более сложных случаях вы можете обратиться к JPA Criteria API или QueryDsl для создания комбинации условий вместо предоставления двух полей firstNamelastName как указано выше

...