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);