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 中看起来如何?因为这就是打印的内容,如果您打印一个列表。
我遇到了一个问题,当我使用 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 中看起来如何?因为这就是打印的内容,如果您打印一个列表。