小编给大家分享一下解决postgresql错误不良的类型值:long的方法,相信大部分人都还不怎么了解,因此分享这边文章给大家学习,希望大家阅读完这篇文章后大所收获,下面让我们一起去学习方法吧!

postgresql错误“org.postgresql.util.PSQLException: 不良的类型值 long ”解决方法:

以下是PostgreSQL抛出例外处的日志片段:

Causedby:org.postgresql.util.PSQLException:不良的类型值long:\x0040010346504d4e00000001000003900101000000000000000002800000028001f4007d000202040000000200000000000000000000000000000000000000005041atorg.postgresql.jdbc.PgResultSet.toLong(PgResultSet.java:2860)atorg.postgresql.jdbc.PgResultSet.getLong(PgResultSet.java:2114)atorg.postgresql.jdbc.PgResultSet.getBlob(PgResultSet.java:418)atorg.postgresql.jdbc.PgResultSet.getBlob(PgResultSet.java:405)atorg.apache.commons.dbcp.DelegatingResultSet.getBlob(DelegatingResultSet.java:565)atorg.apache.commons.dbcp.DelegatingResultSet.getBlob(DelegatingResultSet.java:565)atorg.hibernate.type.descriptor.sql.BlobTypeDescriptor$1.doExtract(BlobTypeDescriptor.java:48)atorg.hibernate.type.descriptor.sql.BasicExtractor.extract(BasicExtractor.java:47)atorg.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:258)atorg.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:254)atorg.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:244)atorg.hibernate.type.AbstractStandardBasicType.hydrate(AbstractStandardBasicType.java:327)atorg.hibernate.persister.entity.AbstractEntityPersister.hydrate(AbstractEntityPersister.java:2775)atorg.hibernate.loader.plan.exec.process.internal.EntityReferenceInitializerImpl.loadFromResultSet(EntityReferenceInitializerImpl.java:305)...64more

解决方法:

在最底层的PostgreSQL81Dialect(藏的太深了),在getSqlTypeDescriptorOverride()接口中找到对应的内容,而且发现默认的oid + bigobject方式是在此定义的。于是重写该接口:

@OverridepublicSqlTypeDescriptorgetSqlTypeDescriptorOverride(intsqlCode){SqlTypeDescriptordescriptor;switch(sqlCode){caseTypes.BLOB://ForceBLOBbinding.Otherwise,byte[]fieldsannotated//with@Lobwillattempttouse//BlobTypeDescriptor.PRIMITIVE_ARRAY_BINDING.Sincethe//dialectusesoidforBlobs,bytearrayscannotbeused.//descriptor=BlobTypeDescriptor.BLOB_BINDING;descriptor=BlobTypeDescriptor.STREAM_BINDING;break;caseTypes.CLOB://descriptor=ClobTypeDescriptor.CLOB_BINDING;descriptor=ClobTypeDescriptor.STREAM_BINDING;break;default:descriptor=super.getSqlTypeDescriptorOverride(sqlCode);break;}returndescriptor;}

推荐使用二进制数组方式存取LOB,而不是默认的oid + bigobject;

如果抛错信息“不良的类型值”后是long,几乎可断定是LOB调用模式的问题;如果是其它类型,需进一步分析。

如果直接用JDBC,对LOB的调用接口是setBinaryStream()、setCharacterStream()等。

以上是解决postgresql错误不良的类型值:long的方法的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!