您好,登錄后才能下訂單哦!
小編給大家分享一下解決postgresql錯誤不良的類型值:long的方法,相信大部分人都還不怎么了解,因此分享這邊文章給大家學習,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去學習方法吧!
postgresql錯誤“org.postgresql.util.PSQLException: 不良的類型值 long ”解決方法:
以下是PostgreSQL拋出例外處的日志片段:
Caused by: org.postgresql.util.PSQLException: 不良的類型值 long : \x0040010346504d4e00000001000003900101000000000000000002800000028001f4007d000202040000000200000000000000000000000000000000000000005041 at org.postgresql.jdbc.PgResultSet.toLong(PgResultSet.java:2860) at org.postgresql.jdbc.PgResultSet.getLong(PgResultSet.java:2114) at org.postgresql.jdbc.PgResultSet.getBlob(PgResultSet.java:418) at org.postgresql.jdbc.PgResultSet.getBlob(PgResultSet.java:405) at org.apache.commons.dbcp.DelegatingResultSet.getBlob(DelegatingResultSet.java:565) at org.apache.commons.dbcp.DelegatingResultSet.getBlob(DelegatingResultSet.java:565) at org.hibernate.type.descriptor.sql.BlobTypeDescriptor$1.doExtract(BlobTypeDescriptor.java:48) at org.hibernate.type.descriptor.sql.BasicExtractor.extract(BasicExtractor.java:47) at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:258) at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:254) at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:244) at org.hibernate.type.AbstractStandardBasicType.hydrate(AbstractStandardBasicType.java:327) at org.hibernate.persister.entity.AbstractEntityPersister.hydrate(AbstractEntityPersister.java:2775) at org.hibernate.loader.plan.exec.process.internal.EntityReferenceInitializerImpl.loadFromResultSet(EntityReferenceInitializerImpl.java:305) ... 64 more
解決方法:
在最底層的PostgreSQL81Dialect(藏的太深了),在getSqlTypeDescriptorOverride()接口中找到對應的內容,而且發(fā)現(xiàn)默認的oid + bigobject方式是在此定義的。于是重寫該接口:
@Override public SqlTypeDescriptor getSqlTypeDescriptorOverride(int sqlCode) { SqlTypeDescriptor descriptor; switch (sqlCode) { case Types.BLOB: // Force BLOB binding. Otherwise, byte[] fields annotated // with @Lob will attempt to use // BlobTypeDescriptor.PRIMITIVE_ARRAY_BINDING. Since the // dialect uses oid for Blobs, byte arrays cannot be used. //descriptor = BlobTypeDescriptor.BLOB_BINDING; descriptor = BlobTypeDescriptor.STREAM_BINDING; break; case Types.CLOB: //descriptor = ClobTypeDescriptor.CLOB_BINDING; descriptor = ClobTypeDescriptor.STREAM_BINDING; break; default: descriptor = super.getSqlTypeDescriptorOverride(sqlCode); break; } return descriptor; }
推薦使用二進制數組方式存取LOB,而不是默認的oid + bigobject;
如果拋錯信息“不良的類型值”后是long,幾乎可斷定是LOB調用模式的問題;如果是其它類型,需進一步分析。
如果直接用JDBC,對LOB的調用接口是setBinaryStream()、setCharacterStream()等。
以上是解決postgresql錯誤不良的類型值:long的方法的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業(yè)資訊頻道!
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。