确认
- [X] 我的版本是最新版本, 我的版本号与 version 相同, 并且项目里无依赖冲突
- [X] 我已经在 issue 中搜索过, 确认问题没有被提出过
- [X] 我已经修改标题, 将标题中的 描述 替换为遇到的问题
当前程序版本
3.5.5
问题描述
详情见:https://blog.csdn.net/xiaosi_xiaosi/article/details/138540152
- 定义的PG数据库对象
@TableName("t_demo")
public class DemoPO {
@TableField(value = "content", typeHandler = JSONTypeHandler.class)
private JSONObject content;
}
- 自定义 JSON Handler
package com.xxx.handler;
import com.alibaba.fastjson2.JSONObject;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedTypes;
import org.postgresql.util.PGobject;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
@MappedTypes(JSONObject.class)
public class JSONTypeHandler extends BaseTypeHandler<JSONObject> {
private static final PGobject jsonObject = new PGobject();
@Override
public void setNonNullParameter(PreparedStatement ps, int i, JSONObject parameter, JdbcType jdbcType) throws SQLException {
jsonObject.setType("json");
jsonObject.setValue(parameter.toString());
ps.setObject(i, jsonObject);
}
@Override
public JSONObject getNullableResult(ResultSet rs, String columnName) throws SQLException {
String sqlJson = rs.getString(columnName);
if (null != sqlJson) {
return JSONObject.parseObject(sqlJson);
}
return null;
}
@Override
public JSONObject getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
String sqlJson = rs.getString(columnIndex);
if (null != sqlJson) {
return JSONObject.parseObject(sqlJson);
}
return null;
}
@Override
public JSONObject getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
String sqlJson = cs.getString(columnIndex);
if (null != sqlJson) {
return JSONObject.parseObject(sqlJson);
}
return null;
}
}
- update Wrapper
public boolean update(String id, JSONObject content) {
LambdaUpdateWrapper<DemoPO> lambdaUpdate = new LambdaUpdateWrapper<>();
lambdaUpdate.eq(DemoPO::getId, id)
lambdaUpdate.set(DemoPO::getContent, content);
return update(lambdaUpdate);
}
在JSONTypeHandler的setNonNullParameter方法添加断点,发现insert都会走到这个方法,但是update却不会走到这边。
public void setNonNullParameter(PreparedStatement ps, int i, JSONObject parameter, JdbcType jdbcType) throws SQLException {
jsonObject.setType("json"); // 这一行添加断点,检查 update 是否经过这边
jsonObject.setValue(parameter.toString());
ps.setObject(i, jsonObject);
}
```
### 详细堆栈日志
```bash
Caused by: org.apache.ibatis.type.TypeException: Error setting non null for parameter #1 with JdbcType null . Try setting a different JdbcType for this parameter or a different configuration property. Cause: org.apache.ibatis.type.TypeException: Error setting non null for parameter #1 with JdbcType null . Try setting a different JdbcType for this parameter or a different configuration property. Cause: org.postgresql.util.PSQLException: No hstore extension installed.
at org.apache.ibatis.type.BaseTypeHandler.setParameter(BaseTypeHandler.java:76)
at com.baomidou.mybatisplus.core.MybatisParameterHandler.setParameters(MybatisParameterHandler.java:296)
... 209 common frames omitted
Caused by: org.apache.ibatis.type.TypeException: Error setting non null for parameter #1 with JdbcType null . Try setting a different JdbcType for this parameter or a different configuration property. Cause: org.postgresql.util.PSQLException: No hstore extension installed.
at org.apache.ibatis.type.BaseTypeHandler.setParameter(BaseTypeHandler.java:76)
at org.apache.ibatis.type.UnknownTypeHandler.setNonNullParameter(UnknownTypeHandler.java:71)
at org.apache.ibatis.type.BaseTypeHandler.setParameter(BaseTypeHandler.java:74)
... 210 common frames omitted
Caused by: org.postgresql.util.PSQLException: No hstore extension installed.
at org.postgresql.jdbc.PgPreparedStatement.setMap(PgPreparedStatement.java:559)
at org.postgresql.jdbc.PgPreparedStatement.setObject(PgPreparedStatement.java:1063)
at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.setObject(HikariProxyPreparedStatement.java)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at org.apache.ibatis.logging.jdbc.PreparedStatementLogger.invoke(PreparedStatementLogger.java:67)
at jdk.proxy3/jdk.proxy3.$Proxy121.setObject(Unknown Source)
at org.apache.ibatis.type.ObjectTypeHandler.setNonNullParameter(ObjectTypeHandler.java:31)
at org.apache.ibatis.type.BaseTypeHandler.setParameter(BaseTypeHandler.java:74)
... 212 common frames omitted
Comment From: miemieYaho
注入成全局