Spring

Spring Boot JPA @Query 문제 해결 방법

기록만이살길 2021. 3. 21. 15:05
반응형

Spring Boot JPA @Query 문제 해결 방법

1. 질문(문제점):

나는 도움이 필요해. JPA를 사용하여 웹 애플리케이션을 작성하고 있습니다. YouTube와 다른 페이지의 예제로 만듭니다. 나는 많이 만들지 만 내 신청에서 한 가지를 보려면 도움이 필요합니다. 미용실 응용 프로그램이기 때문에 고객과 약속 날짜도 있습니다.

이것은 InteliJ https://i.stack.imgur.com/HlDXK.png 에서 내 응용 프로그램의 모습입니다. 이름이 "Patryk"인 클라이언트를 표시하고 싶습니다.

다음은 model.klienci의 코드입니다.

package figura.zaklad_fryzjerski_v3.model;


import javax.persistence.*;

@Entity
@Table(name = "klienci")
public class Klienci {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id_klienta")
    private Integer id_klienta;

    @Column(name = "imie")
    private String imieKlienta;

    @Column(name = "nazwisko")
    private String nazwiskoKlienta;

    @Column(name = "nr_telefonu_klienta")
    private Integer nrTelefonuKlienta;

    @Column(name = "adres_email")
    private  String adresEmailKlienta;
    getters and setters

다음은 저장소의 코드입니다.

package figura.zaklad_fryzjerski_v3.repository;

import figura.zaklad_fryzjerski_v3.model.Klienci;
import org.springframework.data.jpa.repository.JpaRepository;

import org.springframework.stereotype.Repository;



@Repository
public interface KlienciRepository extends JpaRepository<Klienci, Integer> {

}

다음은 service.KlienciService의 코드입니다.

package figura.zaklad_fryzjerski_v3.service.klienci;

import figura.zaklad_fryzjerski_v3.model.Klienci;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.repository.Query;


import java.util.List;

public interface KlienciService {

    List<Klienci> getAllKlieci();
    void saveKlienci(Klienci klienci);
    Klienci getKlienciById(Integer id_klienta);
    void usunKlientaById(Integer id_klienta);
    Page<Klienci> findPaginated(int pageNo, int pageSize);
}

다음은 service.KlienciServiceImpl의 코드입니다.

package figura.zaklad_fryzjerski_v3.service.klienci;

    import figura.zaklad_fryzjerski_v3.model.Klienci;
    import figura.zaklad_fryzjerski_v3.repository.KlienciRepository;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.domain.Page;
    import org.springframework.data.domain.PageRequest;
    import org.springframework.data.domain.Pageable;
    import org.springframework.stereotype.Service;

    import java.util.List;
import java.util.Optional;

@Service
//@Transactional
public class KlienciServiceImpl implements KlienciService{

    @Autowired
    private KlienciRepository klienciRepository;

    @Override
    public List<Klienci> getAllKlieci() {
        return klienciRepository.findAll();
    }

    @Override
    public void saveKlienci(Klienci klienci){
        this.klienciRepository.save(klienci);
    }

    @Override
    public Klienci getKlienciById(Integer id_klienta) {
        Optional<Klienci> optional = klienciRepository.findById(id_klienta);
        Klienci klienci = null;
        if(optional.isPresent()){
            klienci = optional.get();
        }else{
            throw new RuntimeException("Klient nie znaleziony po id :: "+ id_klienta);
        }
        return klienci;
    }

    @Override
    public void usunKlientaById(Integer id_klienta){
        this.klienciRepository.deleteById(id_klienta);
    }

    @Override
    public Page<Klienci> findPaginated(int pageNo, int pageSize) {

        Pageable pageable = PageRequest.of(pageNo - 1,pageSize);
        return this.klienciRepository.findAll(pageable);
    }
}

그리고 여기에 내 응용 프로그램의 페이지에 항목을 표시하는 데 사용하는 컨트롤러를 포함합니다.

 //klient wyświetlanie listy klientów
    @Autowired
    public KlienciService klienciService;
    @GetMapping("/klient_baza")
    public String getKlient_baza(Model model){
        model.addAttribute("listaKlientow",klienciService.getAllKlieci());
        return findPaginated(1, model);
    }

    //Dodawanie klientów do bazy danych
    @GetMapping("/klient_dodaj")
    public String getKlient_dodaj(Model model){
        Klienci klienci = new Klienci();
        model.addAttribute("klienci",klienci);
        return "/klient/klient_dodaj";
    }
    //zapisywanie klientów do bazy danych
    @PostMapping("/klientZapisz")
    public String saveKlient(@ModelAttribute("klienci") Klienci klienci, Model model){
        klienciService.saveKlienci(klienci);

        model.addAttribute("typ", "dodanie_rekordu");
        model.addAttribute("sukces", "Pomyślnie dodano klienta");

        return getKlient_baza(model);
    }

    //strona z edytowaniem klienta
    @GetMapping("/klient_dodaj/{id_klienta}")
    public String showFormForUpdate(@PathVariable(value = "id_klienta") Integer id_klienta, Model model) {

        Klienci klienci = klienciService.getKlienciById(id_klienta);
        model.addAttribute("klienci", klienci);
        model.addAttribute("edycja", "true");
        return "/klient/klient_dodaj";

    }
    //usuwanie klienta  z bazy danych
    @GetMapping("/usun_klienta/{id_klienta}")
    public String usunKlienta(@PathVariable(value = "id_klienta")Integer id_klienta, Model model){

        model.addAttribute("typ","usuniecie_rekordu");
        model.addAttribute("sukces","Pomyślnie usunięto klienta");

        this.klienciService.usunKlientaById(id_klienta);
        return getKlient_baza(model);
    }
    //podział na strony
    @GetMapping("/klient_baza/{pageNo}")
    public String findPaginated(@PathVariable(value = "pageNo")int pageNo, Model model){

        int pageSize = 10;
        Page<Klienci> page = klienciService.findPaginated(pageNo,pageSize);
        List<Klienci> klienciList = page.getContent();

        model.addAttribute("aktualnaStrona", pageNo);
        model.addAttribute("wszystkieStrony", page.getTotalPages());
        model.addAttribute("total", page.getTotalElements());


        model.addAttribute("listaKlientow", klienciList);
        return "/klient/klient_baza";

        }

여기에 추가하는 방법 QUERY METHOD 는 @Query를 사용하여 이름이 "Patryk"인이 클라이언트 만 표시합니까?

2. 해결방안:

@Query로 어노테이션이 달린 메서드를 실제로 사용할 필요는 없습니다. SpringData는 모델 속성을 기반으로 쿼리를 생성하기에 충분히 "스마트"합니다. KlienciRepository 인터페이스에 메서드 선언을 추가하기 만하면됩니다.

List<Klienci> listKlienciByNazwiskoKlienta(String name);

Spring 데이터는 nazwiskoKlienta라는 속성에 대한 Klienci 모델을 조사하고 전달 된 값을 사용하여 동등성 검사를 수행하는 쿼리를 작성합니다. 와일드 카드 쿼리를 수행하려는 경우 Spring 데이터도 자동으로 처리 할 수 ​​있습니다.

List<Klienci> listKlienciByNazwiskoKlientaContaing(String name);
65668714
반응형