복붙노트

[SPRING] Spring Boot에서 MySql Database 쿼리를 사용하는 방법?

SPRING

Spring Boot에서 MySql Database 쿼리를 사용하는 방법?

나는 봄 부팅을 사용하여 API를 만들고있다. 이 프로젝트에서 저는 스프링 웹, JPA, jstl 및 MySql을 API의 종속성으로 사용했습니다. 이 프로젝트에서는 Controller, Model 및 Repository를 만들었습니다. 기본적으로이 API는 CRUD 작업을 수행합니다. GET 요청을 사용하면 3 열만 가져 오려고합니다. 하지만,이 경우 JPA를 사용하는 경우와 같이 사용자 정의 쿼리를 사용하는 방법을 알지 못합니다.

.

내가 어떻게 이럴 수 있니?

내 컨트롤러 클래스.

@RestController
@RequestMapping("/api")
public class ImController {

    @Autowired
    private ImRepository TaskRepository;

    @GetMapping("/projects")
    public List<ImModel> findAll() {
        return (List<ImModel>) TaskRepository.findAll();
    }

    @GetMapping("/developers/{id}")
    public ImModel findByName(@PathVariable final int id){
        return TaskRepository.findById(id);
    }

}

내 저장소 인터페이스.

package com.kisalka.pacrestapi.repository;

import org.springframework.data.jpa.repository.JpaRepository;

import com.kisalka.pacrestapi.model.ImModel;

public interface ImRepository extends JpaRepository<ImModel, Integer> {

    ImModel findById(int id);

}

해결법

  1. ==============================

    1.Spring Docs : 인터페이스 기반 투영법 쿼리의 결과를 제한하여 속성 이름에 대한 노출을 제한하는 가장 쉬운 방법은 특성에 대한 접근 자 메소드를 표시하는 인터페이스를 선언하는 것입니다.

    Spring Docs : 인터페이스 기반 투영법 쿼리의 결과를 제한하여 속성 이름에 대한 노출을 제한하는 가장 쉬운 방법은 특성에 대한 접근 자 메소드를 표시하는 인터페이스를 선언하는 것입니다.

    인터페이스를 만들어 결과를 제한 할 수 있습니다.

    interface LimitImaginaryTable {
      String getDevname();
      String getHrs();
      String getOt();
    }
    

    저장소에서 제한된 결과를 얻기 위해 해당 인터페이스를 사용할 수 있습니다

    public interface ImRepository extends JpaRepository<ImModel, Integer> {
    
        ImModel findById(int id);
        LimitImaginaryTable findById(int id);
        List<LimitImaginaryTable> findByDevname(String name);
    
    }
    

    이제 컨트롤러에서 원하는 결과 세트를 얻을 수 있습니다.

    List<LimitImaginaryTable> myList = taskRepository.findByDevname("JavaDev");
    
  2. ==============================

    2.저장소 내에서 @Query ( "Your query") 주석을 사용하여 데이터베이스를 쿼리 할 수 ​​있습니다. 예를 들어

    저장소 내에서 @Query ( "Your query") 주석을 사용하여 데이터베이스를 쿼리 할 수 ​​있습니다. 예를 들어

    @Query(value="SELECT devname,hrs,ot FROM imaginaryTable",nativeQuery=true)
    private List<Object> getValues();
    

    희망이 당신의 문제를 해결합니다.

  3. ==============================

    3.JSONView에 대한 Spring의 지원을 사용하여 Controller에서 엔티티의 JSON 표현을 사용자 정의 할 수 있습니다.

    JSONView에 대한 Spring의 지원을 사용하여 Controller에서 엔티티의 JSON 표현을 사용자 정의 할 수 있습니다.

    https://spring.io/blog/2014/12/02/latest-jackson-integration-improvements-in-spring#json-views

        @JsonView(View.Summary.class)
        @GetMapping("/developers/{id}")
        public ImModel findByName(@PathVariable final int id){
            return TaskRepository.findById(id);
        }
    

    또는 Spring Data의 프로젝션 기능을 사용하여 저장소 레벨에서 처리 할 수 ​​있습니다.

    https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#projections

        @GetMapping("/developers/{id}")
        public ImModelSummaryProjection findByName(@PathVariable final int id){
            return TaskRepository.someMethodReturningSummaryProjection(id);
        }
    
  4. ==============================

    4.생성자에 대한 매개 변수로 열을 사용하여 개체를 만들 수 있습니다.

    생성자에 대한 매개 변수로 열을 사용하여 개체를 만들 수 있습니다.

    내가 만든 사용자 정의 DTO로 내 자신의 예를 들어 보겠습니다.

    @Query("SELECT new org.twinnation.site.dto.TitleAndDescriptionAndId(a.title, a.description, a.id) "
          + "FROM Article a")
    List<TitleAndDescriptionAndId> getAllArticlesWithoutContent();
    

    DTO TitleAndDescriptionAndId는 다음과 같습니다.

    public class TitleAndDescriptionAndId {
    
        private String title;
        private String description;
        private Long id;
    
    
        public TitleAndDescriptionAndId(String title, String description, Long id) {
            this.title = title;
            this.description = description;
            this.id = id;
        }
    
        // ...
    
    }
    
  5. from https://stackoverflow.com/questions/50096376/how-to-use-mysql-database-queries-in-spring-boot by cc-by-sa and MIT license