javamysqljpamariadbolingo

How to handle BLOB and CLOB in olingo v2?


Here there is pseudocode about how to handle BLOB and CLOB in olingo jpa. I added the needed imports to the pseudocode:

package me;

import java.sql.Blob;
import java.sql.Clob;
import java.sql.SQLException;

import javax.sql.rowset.serial.SerialException;

import org.apache.olingo.odata2.jpa.processor.api.OnJPAWriteContent;
import org.apache.olingo.odata2.jpa.processor.api.exception.ODataJPARuntimeException;

public class OnDBWriteContent implements OnJPAWriteContent {

    @Override
    public Blob getJPABlob(byte[] binaryData) throws ODataJPARuntimeException {
        try {
            return new JDBCBlob(binaryData);
        } catch (SerialException e) {
            ODataJPARuntimeException.throwException(ODataJPARuntimeException.INNER_EXCEPTION, e);
        } catch (SQLException e) {
            ODataJPARuntimeException.throwException(ODataJPARuntimeException.INNER_EXCEPTION, e);
        }
        return null;
    }

    @Override
    public Clob getJPAClob(char[] characterData) throws ODataJPARuntimeException {
        try {
            return new JDBCClob(new String(characterData));
        } catch (SQLException e) {
            ODataJPARuntimeException.throwException(ODataJPARuntimeException.INNER_EXCEPTION, e);
        }
        return null;
    }
}

the only problem is I couldn't find any implementation for JDBCBlob and JDBCClob. Any suggestion about how can I implement them or use some classes?


Solution

  • If You are using MySQL it requires an additional ExceptionInterceptor along with the Blob Implementation. You can have a custom implementation of ExceptionInterceptor and use it to initialise the Blob field.

    The code to achieve it would be as follows

    import java.sql.Blob;
    import java.sql.Clob;
    import java.util.Properties;
    
    import org.apache.olingo.odata2.jpa.processor.api.OnJPAWriteContent;
    import org.apache.olingo.odata2.jpa.processor.api.exception.ODataJPARuntimeException;
    
    import com.mysql.cj.exceptions.ExceptionInterceptor;
    import com.mysql.cj.log.Log;
    
    public class CustomOnJPAWriteContent implements OnJPAWriteContent {
    
        @Override
        public Blob getJPABlob(byte[] binaryData) throws ODataJPARuntimeException {
            return new com.mysql.cj.jdbc.Blob(binaryData, exceptionInterceptor);
        }
    
        @Override
        public Clob getJPAClob(char[] characterData) throws ODataJPARuntimeException {
            
            return new com.mysql.cj.jdbc.Clob(new String(characterData), exceptionInterceptor);
    
        }
    
        ExceptionInterceptor exceptionInterceptor = new ExceptionInterceptor() {
    
            @Override
            public Exception interceptException(Exception sqlEx) {
                // TODO Auto-generated method stub
                return null;
            }
    
            @Override
            public ExceptionInterceptor init(Properties props, Log log) {
                // TODO Auto-generated method stub
                return null;
            }
    
            @Override
            public void destroy() {
                // TODO Auto-generated method stub
    
            }
        };
    
    }