繁体   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