[英]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 定義自己的自定義類型。
首先,您需要創建BitStringType
、 BitStringJavaDescriptor
和BitStringSqlDescriptor
:
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.