[英]java.sql.SQLException: Column 'nombreGarcia' not found. why?
[英]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.