【问题标题】:Spring boot - display specific columns from my database (SQL)Spring boot - 显示我的数据库中的特定列(SQL)
【发布时间】:2021-11-08 23:07:29
【问题描述】:

我正在使用 Spring Tools 和 Spring Boot 框架进行编程。

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

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

我想创建一条 SQL 语句以仅显示 stateadmission_number

我造句:

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

Servlet.service() 用于 servlet [dispatcherServlet] 在上下文中的路径 [] 抛出异常 [请求处理失败;嵌套异常是 org.springframework.dao.InvalidDataAccessResourceUsageException:可以 不执行查询; SQL [SELECT state, admission_number FROM state]; 嵌套异常是 org.hibernate.exception.SQLGrammarException: could 不执行查询] 有根本原因

我知道它在句子中找不到state 的下一列,就好像它会要求我所有列都可以进行选择:

错误描述:

在我的数据库中的列是这样的,如果我在我的句子中添加列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();
}

【问题讨论】:

标签: java mysql sql spring-boot spring-jdbc


【解决方案1】:

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

您有多种解决方案:

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

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

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 将列映射到自定义对象。

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

【讨论】:

  • 我正在使用我的界面:@Query(value="SELECT state, admission_number FROM state", nativeQuery=true) List findDatos();我正在使用我的控制器:@GetMapping("/getDatosEspecial") public List getbyspeccial(){ return stateRepository.findDatos();我得到了错误:找不到列“admission_date”。
  • 请提供您的接口定义,并确保所有方法名称与列名称匹配。即,如果您的接口方法名称是 getAdmissionNumber(),请在查询中使用别名:select state, admission_number as admissionNumber from State
  • 错误仍然存​​在,一切都井井有条,我知道选择寻求我在数据库中插入所有列,如果我不插入它,错误将是“java.sql. SQLException: 列 '未在选择中键入的列的名称' 未找到。"
  • 请编辑您的问题并为您的State 对象添加代码。
  • OK 所以State 是一个类,而不是一个接口,你不能只选择一些列到你的实体类中,你要么必须选择所有数据(见我的回答中的第 1 点),或者如果您真的只需要选择一些列,请使用界面投影或自定义对象(我的回答中的第 2. 3. 或 4. 点)。
【解决方案2】:

你定义了一个接口,你的接口有两个方法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 我现在学习第二种用法

祝你有美好的一天。

【讨论】:

  • 非常感谢您,您的信息已经很有用了,但是我有一个疑问,如果我只想在capital_city以fin“a”开头时只显示选定的数据,您知道我是怎么做到的吗?能get到吗,也就是说是这样的:"SELECT s.state AS state, s.admission_number AS admissionNumber FROM State s WHERE capital_city LIKE a%" 但是这种方式行不通,因为空排列返回
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-02
  • 2016-11-24
  • 1970-01-01
  • 2018-08-23
  • 2020-02-05
  • 2019-03-31
  • 1970-01-01
相关资源
最近更新 更多