Select length(col) 在 jOOQ 中获取 BLOB 内容大小

Select length(col) to get BLOB content size in jOOQ

以下SQL作品

CREATE TABLE stored_file (
  id INT AUTO_INCREMENT NOT NULL,
  content BLOB,
  content_length LONG,
  PRIMARY KEY (id)
);


UPDATE stored_file SET content_length = length(content)

但我不能在 jOOQ 中做同样的事情。

getContext().update(STORED_FILE)
  .set(STORED_FILE.CONTENT_LENGTH, DSL.length(STORED_FILE.CONTENT))

DSL.length 只允许字符串字段类型。

有办法解决这个问题吗?

您的代码 DSL.length(STORED_FILE.CONTENT) 生成异常,因为此处允许使用字符串,但您使用的是 BLOB 数据类型,因此您更改了列内容的数据类型....

每当您达到 jOOQ 的极限时,求助于 plain SQL。您可以像这样编写自己的长度函数:

class MyDSL {
    public static Field<Long> length(Field<byte[]> field) {
        return DSL.field("length({0})", Long.class, field);
    }
}

现在在你的所有陈述中使用它:

getContext().update(STORED_FILE)
            .set(STORED_FILE.CONTENT_LENGTH, MyDSL.length(STORED_FILE.CONTENT))

当然,如果你真的想让 blob 的长度与 blob 本身保持同步,你可能最好 using a trigger(我假设 MySQL),或者也许是一种观点。