Spring 启动 - 显示我的数据库中的特定列 (SQL)

Spring boot - display specific columns from my database (SQL)

我正在 Spring 工具中使用 Spring 引导框架进行编程。

我发现自己处于一个花了我几个小时却无法解决的情况。我在 MySql WorkBench.

中有一个数据库

所有数据都是字符串类型,我在我的数据库中使用以下内容:

我想创建一个 SQL 语句来仅显示 stateadmission_number

我造句如下:

当我 运行 程序并在驱动程序中查找语句时,我收到以下错误:

Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessResourceUsageException: could not execute query; SQL [SELECT state, admission_number FROM state]; nested exception is org.hibernate.exception.SQLGrammarException: could not execute query] with root cause

我知道它没有在 state 的下一列的句子中找到它,就好像它会问我所有的列都可以做一个 select:

错误描述:

在我的数据库中列是这样的,如果我在我的句子中添加列admission_date,它告诉我找不到列admission_number

谢谢你,我希望我已经清楚了(这是我第一次问) 代码状态-型号:

   import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.Table;



@Entity
@Table(name="state")
public class State {
    
    @Id
    private String state;
    private String slug;
    private String code;
    private String nickname;
    private String website;
    private String admission_date;
    private int admission_number;
    private String capital_city;
    private String capital_url;
    private int population;
    private int population_rank;
    private String constitution_url;
    private String state_flag_url;
    private String state_seal_url;
    private String map_image_url;
    private String landscape_background_url;
    private String skyline_background_url;
    private String twitter_url;
    private String facebook_url;
    
    @OneToOne 
    @JoinColumn(name="gobernador_id") 
    private Gobernador gobernador;
    
    @ManyToOne
    @JoinColumn(name="pais_id")
    private Pais pais;
     
    public State() {
    }
    
    public State(String state, String slug, String code, String nickname, String website, String admission_date,
            int admission_number, String capital_city, String capital_url, int population, int population_rank,
            String constitution_url, String state_flag_url, String state_seal_url, String map_image_url,
            String landscape_background_url, String skyline_background_url, String twitter_url, String facebook_url) {
        super();
        this.state = state;
        this.slug = slug;
        this.code = code;
        this.nickname = nickname;
        this.website = website;
        this.admission_date = admission_date;
        this.admission_number = admission_number;
        this.capital_city = capital_city;
        this.capital_url = capital_url;
        this.population = population;
        this.population_rank = population_rank;
        this.constitution_url = constitution_url;
        this.state_flag_url = state_flag_url;
        this.state_seal_url = state_seal_url;
        this.map_image_url = map_image_url;
        this.landscape_background_url = landscape_background_url;
        this.skyline_background_url = skyline_background_url;
        this.twitter_url = twitter_url;
        this.facebook_url = facebook_url;
    }


    public String getState() {
        return state;
    }


    public void setState(String state) {
        this.state = state;
    }


    public String getSlug() {
        return slug;
    }


    public void setSlug(String slug) {
        this.slug = slug;
    }


    public String getCode() {
        return code;
    }


    public void setCode(String code) {
        this.code = code;
    }


    public String getNickname() {
        return nickname;
    }


    public void setNickname(String nickname) {
        this.nickname = nickname;
    }


    public String getWebsite() {
        return website;
    }


    public void setWebsite(String website) {
        this.website = website;
    }


    public String getAdmission_date() {
        return admission_date;
    }


    public void setAdmission_date(String admission_date) {
        this.admission_date = admission_date;
    }


    public int getAdmission_number() {
        return admission_number;
    }


    public void setAdmission_number(int admission_number) {
        this.admission_number = admission_number;
    }


    public String getCapital_city() {
        return capital_city;
    }


    public void setCapital_city(String capital_city) {
        this.capital_city = capital_city;
    }


    public String getCapital_url() {
        return capital_url;
    }


    public void setCapital_url(String capital_url) {
        this.capital_url = capital_url;
    }


    public int getPopulation() {
        return population;
    }


    public void setPopulation(int population) {
        this.population = population;
    }


    public int getPopulation_rank() {
        return population_rank;
    }


    public void setPopulation_rank(int population_rank) {
        this.population_rank = population_rank;
    }


    public String getConstitution_url() {
        return constitution_url;
    }


    public void setConstitution_url(String constitution_url) {
        this.constitution_url = constitution_url;
    }


    public String getState_flag_url() {
        return state_flag_url;
    }


    public void setState_flag_url(String state_flag_url) {
        this.state_flag_url = state_flag_url;
    }


    public String getState_seal_url() {
        return state_seal_url;
    }


    public void setState_seal_url(String state_seal_url) {
        this.state_seal_url = state_seal_url;
    }


    public String getMap_image_url() {
        return map_image_url;
    }


    public void setMap_image_url(String map_image_url) {
        this.map_image_url = map_image_url;
    }


    public String getLandscape_background_url() {
        return landscape_background_url;
    }


    public void setLandscape_background_url(String landscape_background_url) {
        this.landscape_background_url = landscape_background_url;
    }


    public String getSkyline_background_url() {
        return skyline_background_url;
    }


    public void setSkyline_background_url(String skyline_background_url) {
        this.skyline_background_url = skyline_background_url;
    }


    public String getTwitter_url() {
        return twitter_url;
    }


    public void setTwitter_url(String twitter_url) {
        this.twitter_url = twitter_url;
    }


    public String getFacebook_url() {
        return facebook_url;
    }


    public void setFacebook_url(String facebook_url) {
        this.facebook_url = facebook_url;
    }
}

代码状态-控制器:

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import co.edu.poli.model.State;
import co.edu.poli.repository.StateRepository;

@RestController
@RequestMapping("/ap/v1")
public class StateController {
    @Autowired
    private StateRepository stateRepository;

    public StateController() {
        
    }

    //Metodo de post para insertar una fila en la base de datos - POST
    @PostMapping("/postState")
    public State insertstate(@RequestBody State estado) {
        stateRepository.save(estado);
        return estado;
    }
    

    //Metodo de post para insertar una lista en filas en la base de datos -POSTLIST
    @PostMapping("/postListState")
    public String createstateList(@RequestBody List<State> estado) {
        stateRepository.saveAll(estado);
        return "done";
    }
    //Metodo de getAll para mostrar todas las filas de la base de datos -GET ALL
    @GetMapping("/get") //Get All
    public List<State> selectstate(){
        return stateRepository.findAll();           
    }
    //Metodo de getBy para mostrar las filas seleccionadas por estado de la base de datos - GET
    @GetMapping("/get2/{idstate}") //Get by ID
    public State getstateById(@PathVariable String idstate){
        State state = stateRepository.findById(idstate).get();  
        return state;
        
    }
    //Metodo de Delete borrar filas seleccionadas por estado de la base de datos - DELETE
    @DeleteMapping("/delete") //DELETE
    public State deletePais(@RequestParam("idstate") String idState) {
        State state_update = stateRepository.getById(idState);
        stateRepository.delete(state_update);
        return state_update;
    }
    
    //Metodo de actualizar filas seleccionadas por estado de la base de datos. - UPDATE
    @PutMapping("/put/{idstate}")
    public State updatestate(@PathVariable String idstate, @RequestBody State state) {
        State state_update = stateRepository.getById(idstate);
        state_update.setState(state.getState());
        state_update.setSlug(state.getSlug());
        state_update.setCode(state.getCode());
        state_update.setNickname(state.getNickname());
        state_update.setWebsite(state.getWebsite());
        state_update.setAdmission_date(state.getAdmission_date());
        state_update.setAdmission_date(state.getAdmission_date());
        state_update.setCapital_city(state.getCapital_city());
        state_update.setCapital_url(state.getCapital_url());
        state_update.setPopulation_rank(state.getPopulation());
        state_update.setPopulation(state.getPopulation());
        state_update.setConstitution_url(state.getConstitution_url());
        state_update.setState_flag_url(state.getState_flag_url());
        state_update.setState_seal_url(state.getState_seal_url());
        state_update.setLandscape_background_url(state.getLandscape_background_url());
        state_update.setSkyline_background_url(state.getSkyline_background_url());
        state_update.setTwitter_url(state.getTwitter_url());
        state_update.setFacebook_url(state.getFacebook_url());
        stateRepository.save(state_update);
        return state;
    }

    
    @GetMapping("/getDatosEspecial")
     public List<State> getbyspeccial(){
        return stateRepository.findDatos();
    }

}

代码状态 - 存储库:

import java.util.List;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import co.edu.poli.model.State;

public interface StateRepository extends JpaRepository<State, String>{
    
    @Query(value="SELECT state, admission_number FROM state", nativeQuery=true)
    List<State> findDatos();
}

您不能仅将某些特定列直接检索到您的实体对象中。

您有多种解决方案:

  1. 将整个数据直接检索到您的实体中:
@Query("select s from State")
List<State> findDatos();

在使用Spring数据时,可以简单地使用派生方法名称编写:

List<State> findAll();

但我想这就是你想避免的。

  1. 仅将需要的列检索到自定义对象中(您需要使用正确的构造函数创建相应的 bean)
@Query("select new com.example.CustomState(state, admission_number) from State")
List<CustomState> findDatos();
  1. 仅将需要的列检索到界面中(您需要创建该界面)
@Query("select state, admission_number from State", nativeQuery = true)
List<StateInterface> findDatos();

但这将是只读数据。

  1. 仅将需要的列检索到自定义对象中(使用本机查询)

您将不得不使用 @NamedNativeQuery@SqlResultSetMapping 将列映射到自定义对象。

前两个解决方案使用 JPQL,而最后一个使用本机查询。根据您的需要选择您想要的。

您定义了一个接口,并且您的接口有两个方法 getAdmissionNumber() 和 getState()。

public interface CustomState {

    int getAdmissionNumber();
    String getState();

}

public StateRepository extends JpaRepository<State, String>{
    @Query("select s.state AS state, s.admission_number AS admissionNumber from State s")
    List<CustomState> listAdmissionNumberAndState();

}

谢谢@Yann39 我现在学会了第二种用法

祝你有美好的一天。