Здравствуйте, karbofos42, Вы писали:
K>Как-то можно прописать, чтобы вариант с byte[] работал?
Проблема здесь связана с тем, что
MyBatis не знает, как правильно маппить столбец типа
bytea в Postgresql на тип
byte[] в Java. Вам нужно использовать
org.apache.ibatis.type.TypeHandler для корректного маппинга
bytea в
byte[].
Далее, создайте класс, который реализует
org.apache.ibatis.type.TypeHandler<byte[]> для маппинга столбцов типа
bytea на массивы байтов
byte[]:
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.postgresql.util.PGobject;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class ByteArrayTypeHandler extends BaseTypeHandler<byte[]> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, byte[] parameter, JdbcType jdbcType) throws SQLException {
PGobject pgObject = new PGobject();
pgObject.setType("bytea");
pgObject.setValue(new String(parameter));
ps.setObject(i, pgObject);
}
@Override
public byte[] getNullableResult(ResultSet rs, String columnName) throws SQLException {
PGobject pgObject = (PGobject) rs.getObject(columnName);
if (pgObject != null) {
return pgObject.getValue().getBytes();
}
return null;
}
@Override
public byte[] getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
PGobject pgObject = (PGobject) rs.getObject(columnIndex);
if (pgObject != null) {
return pgObject.getValue().getBytes();
}
return null;
}
@Override
public byte[] getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
PGobject pgObject = (PGobject) cs.getObject(columnIndex);
if (pgObject != null) {
return pgObject.getValue().getBytes();
}
return null;
}
}
Зарегистрируйте этот обработчик типов в вашем конфигурационном файле MyBatis (например,
mybatis-config.xml):
<typeHandlers>
<typeHandler handler="your.package.name.ByteArrayTypeHandler"/>
</typeHandlers>
Где
your.package.name — это имя пакета, в котором находится
ByteArrayTypeHandler.
Теперь вы можете использовать
byte[] в вашем интерфейсе Mapper и в XML-запросах без каких-либо изменений:
byte[] getContent(long id);
<select id="getContent">
select content
from table1
where id = #{id}
limit 1
</select>
С этими настройками MyBatis должен корректно маппить столбцы типа
bytea на массивы байтов
byte[].
...<< Dementor 1.4.2 ✪ Lets Play a Game ⚀⚀⚂⚂⚃>>