当前位置: 首页 > 知识库问答 >
问题:

Jooq Postgres可变位

白烨煜
2023-03-14

我正在调查Jooq,发现了一些我几乎找不到文档的东西——没有一个能完全诚实地回答我的问题。

我想做的是在表中有一列,比如permissions Variable bit(2000)(Postgres 9.5)

然而,Jooq对此所做的是将其视为varchar...这显然是不正确的,即使在一代。在这样的事情上,成功的捷径是什么?

共有2个答案

方弘
2023-03-14

我的课程正在进行中,但有了它,我可以存储不同的信息:

public class BitSetBinding implements Binding<String, BitSet> {

    private static final long serialVersionUID = 1L;

    @Override
    public final void sql(final BindingSQLContext<BitSet> ctx) throws SQLException {
        ctx.render().visit(DSL.val(ctx.convert(converter()).value())).sql("::bit");
    }

    @Override
    public final void register(final BindingRegisterContext<BitSet> ctx) throws SQLException {
        ctx.statement().registerOutParameter(ctx.index(), Types.VARCHAR);
    }

    @Override
    public final void set(final BindingSetStatementContext<BitSet> ctx) throws SQLException {
        throw new SQLFeatureNotSupportedException();
        // this most likely won't work: ctx.statement().setString(ctx.index(), castToBit(convert(ctx.convert(converter()).value(),
        // String.class)));
    }

    @Override
    public final void set(final BindingSetSQLOutputContext<BitSet> ctx) throws SQLException {
        throw new SQLFeatureNotSupportedException();
    }

    @Override
    public final void get(final BindingGetResultSetContext<BitSet> ctx) throws SQLException {
        // Get a result set, ie. convert something like '00000000' to a BitSet
        final String fromDatabase = ctx.resultSet().getString(ctx.index());
        ctx.convert(converter()).value(fromDatabase);
    }

    @Override
    public final void get(final BindingGetStatementContext<BitSet> ctx) throws SQLException {
        ctx.convert(converter()).value(ctx.statement().getString(ctx.index()));
    }

    @Override
    public final void get(final BindingGetSQLInputContext<BitSet> ctx) throws SQLException {
        throw new SQLFeatureNotSupportedException();
    }

    @Override
    public Converter<String, BitSet> converter() {
        return new BitSetConverter();
    }

    /**
     * Converter referenced by jOOQ
     */
    private static class BitSetConverter extends AbstractConverter<String, BitSet> {

        private static final long serialVersionUID = 1L;

        public BitSetConverter() {
            super(String.class, BitSet.class);
        }

        @Override
        public BitSet from(final String databaseObject) {
            if (databaseObject == null) {
                return null;
            }
            final BitSet bs = new BitSet();
            int pos = databaseObject.indexOf('1');
            while (pos != -1) {
                bs.set(pos);
                pos = databaseObject.indexOf('1', pos + 1);
            }
            return bs;
        }

        @Override
        public String to(final BitSet userObject) {
            if (userObject == null) {
                return null;
            }
            final StringBuilder sb = new StringBuilder();
            for (int k = 0; k < userObject.length(); k++) {
                sb.append(userObject.get(k) ? '1' : '0');
            }
            return sb.toString();
        }
    }
}
林玮
2023-03-14

我不确定将PostgreSQL的“位字符串”类型映射到java的设计决策是什么。lang.Stringwas。我甚至不排除一个疏忽,即即使它们被称为“位字符串”,它们也不是真正的字符串。

我认为最适合表示这一点的Java类型是位集。因此,您理想的未来方式是实现表单的数据类型绑定:

public class VaryingBitBinding extends Binding<String, BitSet> {
    // ...
}

并在JDBC级别实现它。然后,可以将此绑定挂接到代码生成器中:

<forcedType>
    <userType>java.util.BitSet</userType>
    <binding>com.example.VaryingBitBinding</binding>
    <types>varying\ bit</types>
</forcedType>
 类似资料:
  • 问题内容: 我如何在for循环中创建变量变量? 这是循环: 在此循环中,我想为每次传递创建一个$ seat变量,但必须像这样递增。第一次通过应该是,下次通过:等等。 所以最后应该是: 等等。 因此$ _POST的变量和内容应该是动态的。 问题答案: 首先,除非缺少某些内容,否则我将为此使用数组。具有像变量,等趋于具有少得多的效用和是更为繁琐比使用的阵列。 话虽这么说,使用以下语法: 最后,PHP具

  • 我有一个内联变量函数内联int foo(…) 我需要调用一个宏(我们称它为宏),它也是可变的 基本上,我需要将其所有输入参数传递给宏。由于使用了选项,将重新定义为另一个宏将是一个简单的解决方案,但我还需要来返回值<注意:我正在尝试连接已编写代码的两部分,不允许更改它们<代码>foo(…) 用于代码的第一部分,宏定义于第二部分。我要做的唯一一件事就是定义一个使用宏的foo(),我不能,因为它们都是可

  • 变量绑定默认是不可变的,但加上 mut 修饰语后变量就可以改变。 fn main() { let _immutable_binding = 1; let mut mutable_binding = 1; println!("Before mutation: {}", mutable_binding); // 正确代码 mutable_binding += 1

  • 本文向大家介绍python不可变变量?相关面试题,主要包含被问及python不可变变量?时的应答技巧和注意事项,需要的朋友参考一下 不可变对象是指不可以被引用改变的对象,如字符串 #

  • null null null 所以现在,如果我想把一个应用程序部署到舞台上,我可以简单地运行这个playbook命令: 例如,我将staging/group_vars/webserver中的app1目录的路径定义为“/var/www/staging.app1.com”。但是我也需要为app2部署到相同的服务器上,但是目录不同。是否可以在group_vars中使用条件变量? 所以如果我跑: 敬请指教

  • 问题内容: 我正在努力使可变对象与不可变对象有关。使用可变对象会带来很多负面影响(例如,从方法中返回字符串数组),但是我很难理解它的负面影响。使用可变对象的最佳实践是什么?您是否应尽可能避免使用它们? 问题答案: 好吧,这有几个方面。 没有参考身份的可变对象会在奇数时间导致错误。例如,考虑使用基于值的方法的 : 当实例用作键时,实例在映射中“丢失”,因为实例和相等性基于可变值。这些值在映射之外更改