首页 > 解决方案 > Java Spring Boot 在 SQL 查询中添加随机“d”字符

问题描述

我正在使用 Spring Boot 制作用户管理平台。当我发出 GET 请求以返回用户时,我收到此错误

出现意外错误(类型=内部服务器错误,状态=500)。无法提取结果集;SQL [不适用];嵌套异常是 org.hibernate.exception.SQLGrammarException:无法提取 ResultSet ... 原因:java.sql.SQLSyntaxErrorException:“字段列表”中的未知列“user0_.dtype”

那个随机的“dtype”列是什么?

编辑:我将“类型”更改为“角色”,因为它非常令人困惑。我还注意到,即使我在代码中更改它,我仍然会遇到同样的错误。该问题已相应编辑。

实体

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "users")
public class User {
    @Id
    @Column(name = "id")
    private int id;
    @Column(name = "first_name")
    private String firstName;
    @Column(name = "last_name")
    private String lastName;
    @Column(name = "username")
    private String username;
    @Column(name = "password")
    private String password;
    @Column(name = "role")
    private String role;
    
    public User() {}
    
    public User(String firstName, String lastName, String username, String password, String role) {
        super();
        this.firstName = firstName;
        this.lastName = lastName;
        this.username = username;
        this.password = password;
        this.role = role;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getRole() {
        return role;
    }

    public void setRole(String role) {
        this.role = role;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "User [id=" + id + ", firstName=" + firstName + ", lastName=" + lastName + ", username=" + username
                + ", password=" +password+ ", role=" + role + "]";
    }
}

控制器

@RestController
public class UserController {

    @Autowired
    private UserRepository userRepository;
    
    @GetMapping("/users")
    public List<User> retrieveAllUsers(){
        return userRepository.findAll();
    }
    
    @GetMapping("/users/{id}")
    public User retreiveTask(@PathVariable int id) {
        Optional<User> user = userRepository.findById(id);
        
        return user.get();
    }
    
    @DeleteMapping("/users/{id}")
    public void deleteUser(@PathVariable int id) {
        userRepository.deleteById(id);
    }
    
    @PostMapping("/users")
    public ResponseEntity<Object> createUser(@RequestBody User user){
        User savedUser = userRepository.save(user);
        
        URI location = ServletUriComponentsBuilder.fromCurrentRequest().path("/{id}")
                .buildAndExpand(savedUser.getId()).toUri();
        
        return ResponseEntity.created(location).build();
    }
    
    @PutMapping("/users/{id}")
    public ResponseEntity<Object> updateUser(@RequestBody User user, @PathVariable int id){
        Optional<User> userOptional = userRepository.findById(id);
        
        if(!userOptional.isPresent())
            return ResponseEntity.notFound().build();
        user.setId(id);
        
        userRepository.save(user);
        return ResponseEntity.noContent().build();
    }
}

MySQL 数据库脚本

CREATE TABLE users (
  id int(11) NOT NULL AUTO_INCREMENT,
  first_name varchar(100) NOT NULL,
  last_name varchar(100) NOT NULL,
  username varchar(100) NOT NULL,
  password varchar(100) NOT NULL,
  role text NOT NULL,
  PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

任何帮助,将不胜感激。

标签: javamysqlspringspring-boot

解决方案


https://www.viralpatel.net/hibernate-inheritence-table-per-hierarchy-mapping/

如果@DiscriminatorColumn注释丢失,并且需要一个鉴别器列,则鉴别器列的名称默认为“DTYPE”,鉴别器类型为 DiscriminatorType.STRING。


推荐阅读