开发者问题收集

Java Spring Boot 在 SQL 查询中添加随机“d”字符

2021-01-04
405

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

There was an unexpected error (type=Internal Server Error, status=500). could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet ... Caused by: java.sql.SQLSyntaxErrorException: Unknown column 'user0_.dtype' in 'field list'

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

编辑:我将“type”更改为“role”,因为它非常令人困惑。我还注意到,即使我在代码中更改它,我仍然会收到相同的错误。问题已进行了相应的编辑。

实体

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;

任何帮助都将不胜感激。

3个回答

d 代表数据;用户数据类型。您还将 id 设置为 AUTO_INCREMENT,这意味着您需要通过添加此 @GeneratedValue(strategy = GenerationType.IDENTITY) 在类级别声明它:

@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;

@GetMapping(path = "User")
public ResponseEntity<List<User>> getAllUsers(){
    
    Optional<List<User>> optUsers = Optional.ofNullable(userRepo.findAll());
    
    if(optUsers.isPresent()) {
        List<User> Users = optUsers.get();
        
        return new ResponseEntity<List<User>>(Users, HttpStatus.OK);
    } else {
        return new ResponseEntity<>(null, HttpStatus.NO_CONTENT);
    }
}
ibercode
2021-01-04

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

If the @DiscriminatorColumn annotation is missing, and a discriminator column is required, the name of the discriminator column defaults to "DTYPE" and the discriminator type to DiscriminatorType.STRING.

Lawrence Li
2021-01-05

我发现了问题。我没有提到 User 类是项目中几个类的超类,因为我认为这无关紧要。Spring 不会像实体类那样充当超类。所以我只需要删除注释,而只需添加注释“@MappedSuperclass”。

Azzarian
2021-01-07