Запрос на получение всех клиентов при указании firstName и / или lastName - PullRequest
0 голосов
/ 02 августа 2020

Я работаю над созданием API с использованием RESTful [Spring boot framework, Hibernate, Java 11]. Здесь я пытаюсь реализовать запрос, чтобы получить всех клиентов, когда указано firstName и / или lastName. Итак,

  1. Имя и фамилия могут быть указаны вместе.
  2. Пользователь может указать только имя или фамилию.

I оба эти случая пробовал реализовать в 1 API. Но не получил ожидаемого результата. Это мои классы:

Entity:

@Entity
@Data
@Table(name = "PERSON")
public class PersonEntity {

    @Id
    @Column(name = "ID")
    private Long id;

    @Column(name = "FIRST_NAME")
    private String firstName;

    @Column(name = "LAST_NAME")
    private String lastName;
}

Мой класс репозитория:

import com.customer.data.management.entity.PersonEntity;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface PersonRepository extends JpaRepository<PersonEntity, Long> {

    @Query("select u from PersonEntity u where u.firstName = ?1 or u.lastName = ?2")
    List<PersonEntity> searchByFirstAndOrLastName(String firstName, String lastName);
}

Вот мой интерфейс службы:

import com.ustomer.data.management.entity.PersonEntity;
import com.customer.data.management.exception.BadRequestException;
import com.customer.data.management.exception.NotFoundException;

import java.util.List;

public interface PersonService {

    List<PersonEntity> searchByFirstAndOrLastName(String firstName, String lastName);
}

Затем мой класс ServiceImpl:

import com.customer.data.management.entity.PersonEntity;
import com.customer.data.management.exception.BadRequestException;
import com.customer.data.management.exception.NotFoundException;
import com.customer.data.management.repository.PersonRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.transaction.Transactional;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
 
@Service
@Transactional
public class PersonServiceImpl implements PersonService{

    @Autowired
    PersonRepository repository; 

      
    @Override
    public List<PersonEntity> searchByFirstAndOrLastName(String firstName, String lastName) {

        List<PersonEntity> customers =  repository.searchByFirstAndOrLastName(firstName, lastName);

        if(customers.size() > 0) {
            return customers;
        } else {
            return new ArrayList<PersonEntity>();
        }
    }
}

Мой класс контроллера:

Какие изменения я должен внести в свой запрос в классе репозитория, чтобы добиться этого?

1 Ответ

1 голос
/ 02 августа 2020

Вы можете добавить :column is null как условие or со столбцом, чтобы этот столбец игнорировался, если значение поиска по столбцу null

@Query("select u from PersonEntity u where (:firstName is null or u.firstName = :firstName)"
      +" and (:lastName is null or u.lastName = :lastName)")
List<PersonEntity> searchByFirstAndOrLastName(@Param("firstName") String firstName,
                                              @Param("lastName") String lastName);

Анализ случая:

  • Для поиска случая по firstName и lastName это работает как

    u.firstName = :firstName and u.lastName = :lastName

  • Для поиска case по firstName и lastName null это работает как

    u.firstName = :firstName and true

  • Для поиска case по lastName и firstName имеет значение null, это работает как

    true and u.lastName = :lastName

...