簡體   English   中英

如何在 PostgreSQL 和 Hibernate 中使用 BIT(24) 類型的 map 列

[英]How to map column with type BIT(24) in PostgreSQL with Hibernate

我有一個表,其中有一列類型有點(24)。 我嘗試使用字符串,當我嘗試獲取此 object 時,它映射得很好,但是當我嘗試保存它時,Hibernate 拋出異常: org.postgresql.util.PSQLException: ERROR: column is of type bit but expression is of type character varying

我知道如果有點(1)我可以使用 Boolean,但我不知道我應該怎么做。

提前致謝!

不幸的是,JPA/hibernate 不支持具有參數化長度的 BIT。

幸運的是,您可以使用 hibernate 定義自己的自定義類型。

首先,您需要創建BitStringTypeBitStringJavaDescriptorBitStringSqlDescriptor

public class BitStringType extends AbstractSingleColumnStandardBasicType<String> {

    public static final BitStringType INSTANCE = new BitStringType();

    public BitStringType() {
        super(VarcharTypeDescriptor.INSTANCE, BitStringJavaDescriptor.INSTANCE);
    }

    @Override
    public String getName() {
        return "BitString";
    }

}
public class BitStringJavaDescriptor extends AbstractTypeDescriptor<String> {

    public static final BitStringJavaDescriptor INSTANCE = new BitStringJavaDescriptor();

    public BitStringJavaDescriptor() {
        super(String.class, ImmutableMutabilityPlan.INSTANCE);
    }

    @Override
    public String fromString(String string) {
        return string;
    }

    @Override
    public <X> X unwrap(String value, Class<X> type, WrapperOptions options) {
        if (value == null)
            return null;
        if (String.class.isAssignableFrom(type))
            return (X) value;
        throw unknownUnwrap(type);
    }

    @Override
    public <X> String wrap(X value, WrapperOptions options) {
        if (value == null)
            return null;
        if (String.class.isInstance(value))
            return (String) value;
        throw unknownWrap(value.getClass());
    }

}
public class BitStringSqlDescriptor implements SqlTypeDescriptor {

    public static BitStringSqlDescriptor INSTANCE = new BitStringSqlDescriptor();

    @Override
    public int getSqlType() {
        return Types.OTHER;
    }

    @Override
    public boolean canBeRemapped() {
        return true;
    }

    @Override
    public <X> ValueBinder<X> getBinder(final JavaTypeDescriptor<X> javaTypeDescriptor) {
        return new BasicBinder<X>(javaTypeDescriptor, this) {
            @Override
            protected void doBind(PreparedStatement st, X value, int index, WrapperOptions options) throws SQLException {
                st.setObject(index, javaTypeDescriptor.unwrap(value, String.class, options), Types.OTHER);
            }
            @Override
            protected void doBind(CallableStatement st, X value, String name, WrapperOptions options) throws SQLException {
                st.setObject(name, javaTypeDescriptor.unwrap(value, String.class, options), Types.OTHER);
            }
        };
    }

    @Override
    public <X> ValueExtractor<X> getExtractor(final JavaTypeDescriptor<X> javaTypeDescriptor) {
        return new BasicExtractor<X>(javaTypeDescriptor, this) {
            @Override
            protected X doExtract(ResultSet rs, String name, WrapperOptions options) throws SQLException {
                return javaTypeDescriptor.wrap(rs.getString(name), options);
            }
            @Override
            protected X doExtract(CallableStatement statement, int index, WrapperOptions options) throws SQLException {
                return javaTypeDescriptor.wrap(statement.getString(index), options);
            }
            @Override
            protected X doExtract(CallableStatement statement, String name, WrapperOptions options) throws SQLException {
                return javaTypeDescriptor.wrap(statement.getString(name), options);
            }
        };
    }

}

有了這些類,您就可以為您的字段定義一個類型。 使用正確的 package (在我的情況下,我使用了我的演示com.yonlabs.jpa的那個):

    @Column
    @Type(type = "com.yonlabs.jpa.BitStringType")
    private String bits;

您還可以使用 hibernate注冊此類型,以使用注冊名稱而不是完全限定的 Java class。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM