【问题标题】:Spring Boot JPA @Query problem how to fixSpring Boot JPA @Query 问题如何解决
【发布时间】:2021-04-16 12:07:29
【问题描述】:

我需要一些帮助。我正在使用 JPA 编写 Web 应用程序。我通过 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

这是来自 repository.KlienciRepository 的代码

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”的客户?

【问题讨论】:

    标签: java spring spring-boot hibernate jpa


    【解决方案1】:
    @Repository
    public interface KlienciRepository extends JpaRepository<Klienci, Integer> {
    
    
    @Query(SELECT * from klienci k where k.imieKlienta like "?1%")
    
    List<klienci> findbyfirstname(String firstname);
    
    }
    

    【讨论】:

      【解决方案2】:

      为什么不在整个扩展中使用 Spring Data 的强大功能?

      public interface KlienciRepository extends JpaRepository<Klienci, Integer> {
        Klienci findByImieKlienta (String imieKlienta);
      }
      

      稍后您可以使用所需的字符串调用此方法,在本例中为“Patryk”。

      【讨论】:

        【解决方案3】:
        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> {
            
            @Query(value="SELECT * FROM klienci WHERE imie=?1",nativeQuery = true)
            public List<Klienci> getClientsByName(String clientName);
        }
        

        【讨论】:

        • 您能否提供一些上下文并正确格式化答案。谢谢
        【解决方案4】:

        将此代码放入您的存储库中

        @Repository
        public interface KlienciRepository extends JpaRepository<Klienci, Integer> {
           
           List<Klienci> findByimieKlientaIgnoreCase(String firstName);
        }
        

        【讨论】:

          【解决方案5】:

          您实际上并不需要使用带有@Query 注释的方法。 Spring Data 足够“智能”,可以根据模型属性生成查询。你可以在你的 KlienciRepository 接口中添加一个方法声明:

          List<Klienci> listKlienciByNazwiskoKlienta(String name);
          

          Spring data 将在 Klienci 模型中查找名为 nazwiskoKlienta 的属性并构建一个查询,该查询使用传入的值进行相等性检查。如果您想做通配符查询,Spring data 也可以自动处理:

          List<Klienci> listKlienciByNazwiskoKlientaContaing(String name);
          

          【讨论】:

            猜你喜欢
            • 2021-11-14
            • 2017-10-19
            • 2019-03-29
            • 2014-08-07
            • 1970-01-01
            • 2020-08-21
            • 1970-01-01
            • 2020-01-06
            • 2019-06-06
            相关资源
            最近更新 更多