在jOOQ中将byte []映射到BLOB在查询中变为NULL

时间:2015-04-07 16:11:49

标签: 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) {
        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[]生成正常。)

1 个答案:

答案 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");
    }
}

以上可能现在回答你的问题。另一方面:

  1. 这不是您通过网络下载资源的方式。这只会生成URL的二进制表示,而不是其内容; - )
  2. 我个人认为你不应该在数据访问层中实现这种逻辑,但这个讨论超出了这个问题的范围。