Iho*_*din 1 java postgresql hibernate jpa
我有一个表,其中有一列,其类型是位(24)。我尝试使用 String,当我尝试获取这个对象时,它映射得很好,但是当我尝试保存它时,Hibernate 抛出异常:org.postgresql.util.PSQLException: ERROR: column is of type bit but expression is of type character varying
我知道如果它是位(1)我可以使用布尔值,但我不知道在我的情况下应该做什么。
提前致谢!
小智 6
不幸的是,JPA/hibernate 不支持具有参数化长度的 BIT。
幸运的是,您可以使用 hibernate 定义自己的自定义类型。
首先,您需要创建BitStringType、BitStringJavaDescriptor和BitStringSqlDescriptor:
public class BitStringType extends AbstractSingleColumnStandardBasicType<String> {
public static final BitStringType INSTANCE = new BitStringType();
public BitStringType() {
super(BitStringSqlDescriptor.INSTANCE, BitStringJavaDescriptor.INSTANCE);
}
@Override
public String getName() {
return "BitString";
}
}
Run Code Online (Sandbox Code Playgroud)
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());
}
}
Run Code Online (Sandbox Code Playgroud)
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);
}
};
}
}
Run Code Online (Sandbox Code Playgroud)
有了这些类,您就可以为您的字段定义类型。请使用正确的包(在我的例子中,我使用了演示中的包com.yonlabs.jpa):
@Column
@Type(type = "com.yonlabs.jpa.BitStringType")
private String bits;
Run Code Online (Sandbox Code Playgroud)
您还可以向 hibernate注册此类型以使用注册名称而不是完全限定的 Java 类。
| 归档时间: |
|
| 查看次数: |
1138 次 |
| 最近记录: |