Java 将字节[]映射到jOOQ中的BLOB在查询中变为NULL
我正在尝试将Java中的Java 将字节[]映射到jOOQ中的BLOB在查询中变为NULL,java,mysql,jooq,Java,Mysql,Jooq,我正在尝试将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) {
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();
}
(错误消息不是如何处理异常,但是查看日志这不是故障点。
字节[]
生成正常。)当前方法的问题在于:
public void setAvatarUrl(String avatarUrl) {
try {
this.avatar = avatarUrl.getBytes("UTF-8");
} catch (UnsupportedEncodingException e) {
System.err.println("failed to getBytes() on avatar");
}
}
显然,您在子类型UserRecordExt
中添加了某种类型的avatar
字段。但是,当您调用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");
}
}
以上内容可能马上就回答了你的问题。另一方面:
不要对约克失去信心。我不认为在过去的6年里有如此严重的错误没有被注意到。。。您的问题中缺少了一些信息,即它是如何工作的:“setAvatarUrl()将此字符串转换为字节[]”。您能解释一下吗?你实现了一个转换器吗?我们的想法是在数据库中为一个图像存储一个BLOB,当我们取出它时,我们将其转换为base64编码的图像,然后再发送给客户端。当用户想要更新图像时,也会发生相反的情况。我将把这个代码添加到我的问题中。困难在于,我们希望在没有化身的情况下支持回退,根据其他列生成图像。我已经看过
Converter
类,如果不是因为这个额外的需求,它看起来就像是一条路要走。无论如何,我会尝试实现它!谢谢。我怀疑从你的角度来看,这几乎是不可能诊断的。虽然我看到你建议不要改变你的模式来支持一个框架,但我们正处于数据库升级的中间!也许我们应该将回退案例(即根据电子邮件/facebook用户名生成化身)推送到数据库中,以便我们可以按照您的建议使用转换器。使用jOOQ,您当然不需要根据jOOQ的任何规则更改模式。我只是相信你在setAvatarUrl()
setter()中犯了一个小错误,在父类上调用setAvatar()
效果很好。非常感谢。我们的图像存储为BLOB,这些BLOB经过base64编码并加载到客户端。它工作得很好,尽管可能没有充分利用缓存。不过,我将在某个时候实现转换器,这似乎是一种更干净的方法。通过对现有项目执行升级来学习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");
}
}