Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将字节[]映射到jOOQ中的BLOB在查询中变为NULL_Java_Mysql_Jooq - Fatal编程技术网

Java 将字节[]映射到jOOQ中的BLOB在查询中变为NULL

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) {

我正在尝试将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();
}

(错误消息不是如何处理异常,但是查看日志这不是故障点。
字节[]
生成正常。)

当前方法的问题在于:

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");
    }
}
以上内容可能马上就回答了你的问题。另一方面:

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

  • 不要对约克失去信心。我不认为在过去的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");
        }
    }