按照PostgreSQL JDBC驱动程序中的这个主题,我正在寻找一种优雅的方法来利用MyBatis内置的缓存功能来实现包含sql.Array的ResultSet。
MyBatis文档节录
读写缓存将返回缓存对象的副本(通过序列化).
由于MyBatis只能缓存实现Serializable接口的对象,而且sql.Array接口没有对其进行扩展,在我的特殊情况下,PgArray也没有实现它,所以MyBatis在查询包含数组或agg()函数结果的ResultSet时抛出org.apache.ibatis.cache.CacheException: Error serializing object. Cause: java.io.NotSerializableException。
在这种情况下,实现缓存的首选方法是什么?
我可以结合使用javax.sql.rowset.serial.SerialArray和MyBatis ResultMap集合或关联吗?
例如:
<association property="values" column="myArrayColumn" javaType="ArrayList" jdbcType ="SerialArray"/>发布于 2017-01-23 17:37:33
据我所知,结果集中的列是SQL类型。您希望在会话中多次使用相同的参数执行相同的查询,第一次按下数据库,然后按下缓存。
使用Mybatis关联将平面结果行映射到对象结构。Mybatis集合的目的是映射嵌套在一个对象中的多个结果行(例如:选择父和子对象)。这两种方法在这里都不适用。在这里,这是一个元素的数组/集合,但每一行都内联在列中。
您不必费心缓存SQL :您必须将其映射到结果类型,然后忘记它。
然后扩展org.apache.ibatis.type.BaseTypeHandler
@Override
public final Object getNullableResult(final ResultSet resultSet, final String columnName) throws SQLException {
LOGGER.debug("getNullableResult - resultSet/columnName");
final Array array = resultSet.getArray(columnName);
return array.getArray();
}
@Override
public final Object getNullableResult(final ResultSet resultSet, final int columnIndex) throws SQLException {
LOGGER.debug("getNullableResult - resultSet/columnIndex");
final Array array = resultSet.getArray(columnIndex);
return array.getArray();
}这里返回的值是一个基本的java,但是您可以列出或构建您想要的任何结构。
引用要在resultMap:<result column="arrayColumnName" property="destinationProperty" typeHandler="yourArrayTypeHandlerClass.fullQualifiedName" />中使用的类型处理程序
SQL不能序列化:这是一个资源:它依赖于获取之后关闭的ResultSet,也取决于关闭的PreparedStatement。
缓存的结果是映射结果类型的对象的集合,应该是可序列化的。
https://stackoverflow.com/questions/41506394
复制相似问题