我正在尝试将Java中的byte[]
映射到MySQL数据库中的BLOB字段。这是相关的代码:
public void update(IUser data) {
UserRecordExt user = <get user>;
// copy other fields over
user.from(data, USER.OTHERFIELD, USER.OTHERFIELD2);
if (data instanceof IUserExt) {
String avatar = ((IUserExt) data).getAvatarUrl();
if (avatar != null) {
user.setAvatarUrl(avatar);
}
}
/* **** */
user.update();
}
IUser
是jOOQ为我们的SQL表生成的接口。IUserExt
是该界面的扩展,支持我们的API用于临时存储数据的avatarUrl
。UserRecordExt
扩展了UserRecord
并实施了IUserExt
。getAvatarUrl()
从我们的API调用中收到base64编码的字符串。setAvatarUrl() converts this string to a
字节[] , and stores it under
UserRecordExt.avatar`。我想要保存到的数据库中的字段是avatar
,当我在调试器中到达/* **** */
时,我可以看到avatar
属性存在且是填充的byte[]
。
我的问题是,当调用user.update()
时,我在控制台中看到的生成的SQL查询将avatar
设置为NULL
。我绝对不知道这可能是什么原因,在这里失去对jOOQ的信心,因为当我将更新写入数据库时,我希望user
对象中存在任何字段。
有什么想法吗?
以下是setAvatarUrl()
的代码:
public void setAvatarUrl(String avatarUrl) {
try {
this.avatar = avatarUrl.getBytes("UTF-8");
} catch (UnsupportedEncodingException e) {
System.err.println("failed to getBytes() on avatar");
}
}
(错误消息不是应该如何处理异常,但是查看日志这不是故障点。byte[]
生成正常。)
答案 0 :(得分:1)
目前的方法存在问题:
public void setAvatarUrl(String avatarUrl) {
try {
this.avatar = avatarUrl.getBytes("UTF-8");
} catch (UnsupportedEncodingException e) {
System.err.println("failed to getBytes() on avatar");
}
}
您显然在子类型avatar
中添加了某种UserRecordExt
字段。但是当你打电话给update()
时,jOOQ怎么会知道呢?这个价值实际上不是记录的一部分。
更好的实施方式是:
public void setAvatarUrl(String avatarUrl) {
try {
// This will actually set the AVATAR value on the record itself!
super.setAvatar(avatarUrl.getBytes("UTF-8"));
} catch (UnsupportedEncodingException e) {
System.err.println("failed to getBytes() on avatar");
}
}
以上可能现在回答你的问题。另一方面: