簡體   English   中英

java.sql.SQLException:找不到列“序列號”。 (彈簧靴)

[英]java.sql.SQLException: Column 'serialnumber' not found. (spring boot)

我正在用 spring 啟動編寫待辦事項列表 web 應用程序。 我有 2 個實體:用戶(字段:用戶 ID(ID)、用戶名、密碼項目(字段:序列號(ID)、任務、用戶 ID。我想讓每個用戶只看到他的任務。所以我嘗試提取所有任務來自“任務”表。當我嘗試通過自定義查詢檢索信息時,(我認為)hibernate 無法讀取該表。但是當我從 Repository 接口使用像 findAll() 這樣的內置方法時,它是有效的。

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Item {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer serialnumber;
    private int userid;
    private String task;

    public Item() {

    }

    public Item(int userid, String task) {
        this.userid = userid;
        this.task = task;
    }

    public Integer getSerialnumber() {
        return serialnumber;
    }

    public void setSerialnumber(Integer serialnumber) {
        this.serialnumber = serialnumber;
    }

    public int getUserid() {
        return userid;
    }

    public void setUserid(int userid) {
        this.userid = userid;
    }

    public String getTask() {
        return task;
    }

    public void setTask(String task) {
        this.task = task;
    }

    @Override
    public String toString() {
        return "Item{" +
                "serialnumber=" + serialnumber +
                ", userid=" + userid +
                ", task='" + task + '\'' +
                '}';
    }
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.List;

@Controller
public class MainController {


    @Autowired
    private ItemRepository itemRepository;

.....

@PostMapping("/addItem")
    public String addItem(@RequestParam String task,
                          @CookieValue(name = "id") String id,
                          Model model) {

        Item item = new Item(Integer.valueOf(id), task);
        itemRepository.save(item);
        print(item.toString());
        model.addAttribute("items", itemRepository.findItemsByUserId(Integer.valueOf(id)));
        return "list";
    } 
......
}
import org.springframework.data.repository.CrudRepository;

import java.util.List;

public interface ItemRepository extends CrudRepository<Item, Integer> {

    @Query(value = "SELECT task FROM item WHERE userid = ?1", nativeQuery = true)
    List<Item> findItemsByUserId(Integer userid);

}
Hibernate: SELECT task FROM item WHERE userid = ?
2022-04-02 23:23:45.733  WARN 36504 --- [nio-8080-exec-6] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 0, SQLState: S0022
2022-04-02 23:23:45.733 ERROR 36504 --- [nio-8080-exec-6] o.h.engine.jdbc.spi.SqlExceptionHelper   : Column 'serialnumber' not found.
2022-04-02 23:23:45.743 ERROR 36504 --- [nio-8080-exec-6] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : 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 task FROM item WHERE userid = ?]; nested exception is org.hibernate.exception.SQLGrammarException: could not execute query] with root cause

java.sql.SQLException: Column 'serialnumber' not found.
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129) ~[mysql-connector-java-8.0.28.jar:8.0.28]

問題可能是您的查詢在 select 子句中指定了列task ,但您期望List<Item>作為findItemsByUserId方法中的返回類型。

如果您希望返回整個Item ,那么您應該將查詢更改為"SELECT * FROM item WHERE userid =?1"以便 select 所有列。

但是,如果您只需要現場task ,那么您必須更改方法返回類型,因為您需要投影(特定列選擇)。 這可以通過定義如下接口來完成:

public interface TaskDto {
    String getTask();
}

然后你必須選擇:

@Query(value = "SELECT task FROM item WHERE userid = ?1", nativeQuery = true)
List<TaskDto> findItemsByUserId(Integer userid);

@Query(value = "SELECT * FROM item WHERE userid = ?1", nativeQuery = true)
List<Item> findItemsByUserId(Integer userid);
@Query(value = "SELECT task FROM item WHERE userid = ?1", nativeQuery = true)
List<Item> findItemsByUserId(Integer userid);

很明顯,您的查詢正在返回一個字符串值列表,並且您正試圖將它們轉換為您的 Item 實體的列表。

如果您想將結果作為項目列表獲取,請使用

@Query(value = "SELECT * FROM item WHERE userid = ?1", nativeQuery = true)
List<Item> findItemsByUserId(Integer userid);

或者如果您只需要任務的字符串列表,請使用

@Query(value = "SELECT task FROM item WHERE userid = ?1", nativeQuery = true)
List<String> findItemsByUserId(Integer userid);

相應地更改調用方方法。 根據您的錯誤“找不到序列號”,而 JPA/Hibernate 使用反射 API 將表中的各個列映射到實體中相應的字段。 由於您是專門獲取“任務”,因此所有其他列都丟失了。 因此“找不到序列號”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM