mybatis "Select * from Table" return 数字列表而不是对象列表

mybatis "Select * from Table" return list of numbers instead of list of objects

我遇到了一个问题,当我使用 mybatis Mappers 从我的 h2 数据库中获取和对象时,我最终得到了一个后续数字的数组,而不是映射到我插入的 Class 个对象的数组入数据库。例如,如果我在 Message table 中插入 3 条消息,当我查询数据库而不是包含我的消息的列表时,我会得到 [1,2,3]。这是我的代码:

架构:

CREATE TABLE IF NOT EXISTS MESSAGES (
    messageid INT PRIMARY KEY auto_increment,
    username VARCHAR NOT NULL,
    messageText VARCHAR NOT NULL,
    createdTime DATETIME NOT NULL
);

型号:

public class Message {
    private String username;
    private String messageText;
    private Integer messageid;
    private Date createdTime;

    public Message(String username, String messageText, Integer messageid, Date createdTime) {
        this.username = username;
        this.messageText = messageText;
        this.messageid = messageid;
        this.createdTime = createdTime;
    }
// Getters and Setters
}

映射器

@Mapper
public interface MessageMapper {

    @Select("SELECT * from MESSAGES ORDER BY createdTime")
    List<Message> getAllMessages();

    @Select("SELECT * from MESSAGES WHERE username = #{username}")
    Message getMessage(String username);

    @Insert("INSERT INTO MESSAGES (username, messageText, createdTime) VALUES(#{username}, #{messageText}, #{createdTime})")
    @Options(useGeneratedKeys = true, keyProperty = "messageid")
    int insert(Message message);

}

消息服务

@Service
public class MessageService {

    private MessageMapper messageMapper;

    public MessageService(MessageMapper messageMapper) {
        this.messageMapper = messageMapper;
    }

    public int createChatMessage(Message message) {
        Message newMessage = new Message(message.getUsername(), message.getMessageText(), null, new Date());
        return messageMapper.insert(newMessage);
    }

    public List<Message> getAllMessages() {
        return messageMapper.getAllMessages();
    }

    public Object getMessage(String username) { return messageMapper.getMessage(username); }
}

和消息控制器

public class MessageController {

    private MessageService messageService;

    public MessageController(MessageService messageService) {
        this.messageService = messageService;
    }

    @GetMapping("/chat")
    public String getChats(@ModelAttribute("message") Message message, Authentication authentication, Model model) {
        model.addAttribute("messages", this.messageService.getAllMessages());
        model.addAttribute("username", authentication.getName());
        return "chat";
    }

    @PostMapping("/chat")
    public String postChat(@ModelAttribute("message") Message message, Authentication authentication, Model model) {
        String username = authentication.getName();
        message.setUsername(username);
        message.setCreatedTime(new Date());
        messageService.createChatMessage(message);

        message.setMessageText("");

        model.addAttribute("messages", this.messageService.getAllMessages());
        model.addAttribute("username", username);

        return "chat";
    }

}

我可以在我的 h2 控制台中看到,当我添加消息时,它们被正确地插入到数据库中,但是当我尝试在 MessageController 中使用方法 messageService.getAllMessages() 时,它会抛出错误:

Data conversion error converting "I wanna dance" [22018-200]; nested exception is org.h2.jdbc.JdbcSQLDataException: Data conversion error converting "I wanna dance" [22018-200]] with root cause

java.lang.NumberFormatException: For input string: "I wanna dance"

同样,如果我添加 3 条消息 System.out.println(messageService.getAllMessages()) 打印 [1,2,3]

谁能告诉我我犯了什么错误?

你的问题可能是列的顺序。

当您查询 SELECT * from MESSAGES 时,您没有定义列。因此,您将获得 create-table:

中定义的列
  • 消息编号
  • 用户名
  • 消息文本
  • 创建时间

但是您的消息 class 按以下顺序定义属性:

  • 用户名
  • 消息文本
  • 消息编号
  • 创建时间

您收到的错误消息看起来无法将某些内容转换为 int 字段,可能是第三列 messageText 到 messageid。

我会尝试以正确的顺序将列添加到您的 select 子句中。喜欢SELECT username, messageText,messageid,createdTime from MESSAGES

如果这没有帮助,我会从 select 开始,只创建一个列并从那里开始构建。

关于“1,2,3”的打印 - 您的 toString() 方法在消息 class 中看起来如何?因为这就是打印的内容,如果您打印一个列表。