This is an automated email from the ASF dual-hosted git repository.

mridulpathak pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/ofbiz-framework.git


The following commit(s) were added to refs/heads/trunk by this push:
     new a98e05d083 Store and read blob fields as bytes on binary columns
a98e05d083 is described below

commit a98e05d083b818c2014ca8c41648f649d7851fee
Author: Mridul Pathak <[email protected]>
AuthorDate: Tue Oct 27 12:09:32 2026 +0530

    Store and read blob fields as bytes on binary columns
    
    On PostgreSQL the blob field type is a BYTEA column, but the PostgreSQL 
JDBC driver maps setBlob and getBlob to large objects, so storing a Blob failed 
with "column is of type bytea but expression is of type bigint" and reading one 
failed with "Bad value for type long". When the column's SQL type is binary, 
the blob value handler now binds the value with setBytes and reads it back with 
getBytes wrapped in a SerialBlob. Other databases keep using setBlob and 
getBlob.
---
 .../apache/ofbiz/entity/jdbc/JdbcValueHandler.java   | 20 +++++++++++++++++++-
 1 file changed, 19 insertions(+), 1 deletion(-)

diff --git 
a/framework/entity/src/main/java/org/apache/ofbiz/entity/jdbc/JdbcValueHandler.java
 
b/framework/entity/src/main/java/org/apache/ofbiz/entity/jdbc/JdbcValueHandler.java
index 972146aacc..c83c3e299c 100644
--- 
a/framework/entity/src/main/java/org/apache/ofbiz/entity/jdbc/JdbcValueHandler.java
+++ 
b/framework/entity/src/main/java/org/apache/ofbiz/entity/jdbc/JdbcValueHandler.java
@@ -339,12 +339,30 @@ public abstract class JdbcValueHandler<T> {
         public Class<Object> getJavaClass() {
             return Object.class;
         }
+        /**
+         * Returns true when the column is a binary type (like PostgreSQL 
BYTEA) rather than a BLOB.
+         * Some drivers, like PostgreSQL's, map the JDBC Blob methods to large 
objects, which cannot
+         * be used with such a column, so the value is passed as bytes instead.
+         */
+        private boolean isBinaryColumn() {
+            int sqlType = getSqlType();
+            return sqlType == Types.BINARY || sqlType == Types.VARBINARY || 
sqlType == Types.LONGVARBINARY;
+        }
         @Override
         protected void castAndSetValue(PreparedStatement ps, int 
parameterIndex, Object obj) throws SQLException {
-            ps.setBlob(parameterIndex, (Blob) obj);
+            Blob blob = (Blob) obj;
+            if (isBinaryColumn()) {
+                ps.setBytes(parameterIndex, blob.getBytes(1, (int) 
blob.length()));
+            } else {
+                ps.setBlob(parameterIndex, blob);
+            }
         }
         @Override
         public Object getValue(ResultSet rs, int columnIndex) throws 
SQLException {
+            if (isBinaryColumn()) {
+                byte[] bytes = rs.getBytes(columnIndex);
+                return bytes != null ? new SerialBlob(bytes) : null;
+            }
             Blob fieldBlob = rs.getBlob(columnIndex);
             if (fieldBlob != null) {
                 return new SerialBlob(fieldBlob);

Reply via email to