![](/img/trans.png)
[英]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.