首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sql.Array缓存在MyBatis中的正确使用方法

sql.Array缓存在MyBatis中的正确使用方法
EN

Stack Overflow用户
提问于 2017-01-06 13:05:36
回答 1查看 560关注 0票数 0

按照PostgreSQL JDBC驱动程序中的这个主题,我正在寻找一种优雅的方法来利用MyBatis内置的缓存功能来实现包含sql.ArrayResultSet

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.SerialArrayMyBatis ResultMap集合或关联吗?

例如:

代码语言:javascript
复制
<association property="values" column="myArrayColumn" javaType="ArrayList"  jdbcType ="SerialArray"/>
EN

回答 1

Stack Overflow用户

发布于 2017-01-23 17:37:33

据我所知,结果集中的列是SQL类型。您希望在会话中多次使用相同的参数执行相同的查询,第一次按下数据库,然后按下缓存。

使用Mybatis关联将平面结果行映射到对象结构。Mybatis集合的目的是映射嵌套在一个对象中的多个结果行(例如:选择父和子对象)。这两种方法在这里都不适用。在这里,这是一个元素的数组/集合,但每一行都内联在列中。

您不必费心缓存SQL :您必须将其映射到结果类型,然后忘记它。

然后扩展org.apache.ibatis.type.BaseTypeHandler

代码语言:javascript
复制
@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。

缓存的结果是映射结果类型的对象的集合,应该是可序列化的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41506394

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档