在我将PostgreSQL 13个数据库列标记更改为jsonb后,执行sql时抛出错误:
Caused by: org.springframework.jdbc.BadSqlGrammarException:
### Error updating database. Cause: org.postgresql.util.PSQLException: ERROR: column "tags" is of type jsonb but expression is of type character varying
Hint: You will need to rewrite or cast the expression.
Position: 519
### The error may exist in class path resource [mybatis/mapper/dolphin/RssSubSourceMapper.xml]
### The error may involve com.dolphin.soa.post.dao.RssSubSourceMapper.updateByPrimaryKeySelective-Inline
### The error occurred while setting parameters
### SQL: UPDATE rss_sub_source SET sub_url = ?, created_time = ?, updated_time = ?, sub_status = ?, rss_type = ?, standard_type = ?, standard_version = ?, cron = ?, trigger_count = ?, next_trigger_time = ?, sub_name = ?, last_trigger_time = ?, intro = ?, failed_count = ?, frequency_month = ?, reputation = ?, rep_latest_refresh_time = ?, scrapy_take_time = ?, censor_status = ?, etag = ?, last_modified = ?, editor_pick = ?, fav_icon_url = ?, dynamic_interval = ?, creator = ?, tags = ?, article_count = ?, article_count_latest_refresh_time = ?, comment_rss = ?, part_output = ? WHERE id = ?
### Cause: org.postgresql.util.PSQLException: ERROR: column "tags" is of type jsonb but expression is of type character varying
Hint: You will need to rewrite or cast the expression.
Position: 519
; bad SQL grammar []; nested exception is org.postgresql.util.PSQLException: ERROR: column "tags" is of type jsonb but expression is of type character varying
Hint: You will need to rewrite or cast the expression.
Position: 519
at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:239) ~[spring-jdbc-5.3.19.jar!/:5.3.19]
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:70) ~[spring-jdbc-5.3.19.jar!/:5.3.19]
at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:91) ~[mybatis-spring-2.0.6.jar!/:2.0.6]
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:441) ~[mybatis-spring-2.0.6.jar!/:2.0.6]
at com.sun.proxy.$Proxy135.update(Unknown Source) ~[?:?]
at org.mybatis.spring.SqlSessionTemplate.update(SqlSessionTemplate.java:288) ~[mybatis-spring-2.0.6.jar!/:2.0.6]
at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:67) ~[mybatis-3.5.6.jar!/:3.5.6]
at org.apache.ibatis.binding.MapperProxy$PlainMethodInvoker.invoke(MapperProxy.java:152) ~[mybatis-3.5.6.jar!/:3.5.6]
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:85) ~[mybatis-3.5.6.jar!/:3.5.6]
at com.sun.proxy.$Proxy152.updateByPrimaryKeySelective(Unknown Source) ~[?:?]
在使用mybatis时,我应该如何处理spring boot应用程序中的jsonb?
最后添加JsonTypeHandler解决了这个问题:
package misc.config.mybatis;
import com.alibaba.fastjson.JSON;
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({Object.class})
public class JsonTypeHandler extends BaseTypeHandler<Object> {
private Class<Object> clazz;
public JsonTypeHandler(Class<Object> clazz) {
this.clazz = clazz;
}
public JsonTypeHandler() {
}
private static final PGobject jsonObject = new PGobject();
@Override
public void setNonNullParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {
jsonObject.setType("json");
jsonObject.setValue(JSON.toJSONString(parameter));
ps.setObject(i, jsonObject);
}
@Override
public Object getNullableResult(ResultSet rs, String columnName) throws SQLException {
return JSON.parseObject(rs.getString(columnName), clazz);
}
@Override
public Object getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
return JSON.parseObject(rs.getString(columnIndex), clazz);
}
@Override
public Object getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
return JSON.parseObject(cs.getString(columnIndex), clazz);
}
}
在mybatis映射器xml中,指定自定义JsonTypeHandler,如下所示:
<result column="tags" jdbcType="OTHER" property="tags" typeHandler="misc.config.mybatis.JsonTypeHandler" />
如果使用mybatis代码自动生成器,请添加如下代码生成器配置:
<table tableName="rss_sub_source"
enableCountByExample="true"
enableUpdateByExample="true"
enableDeleteByExample="true"
enableSelectByExample="true"
selectByExampleQueryId="true">
<generatedKey column="ID" sqlStatement="JDBC" identity="true" />
<columnOverride column="tags" jdbcType="OTHER" typeHandler="misc.config.mybatis.JsonTypeHandler"/>
</table>
问题内容: 在不同数据库之间进行切换时,关于包含大对象(BLOB)的hibernate映射,我有一个奇怪的问题。 上面的字段在MySQL和Oracle中创建一个字节数组字段,但是在PostreSQL中,它创建一个oid类型的字段。 现在,当我尝试访问该字段时,它在其他数据库中也能正常工作,但是在PostgreSQL中,它失败并显示以下错误 因此,我试图简单地删除“ @Lob”注释,这将解决Post
这是我的实体类,映射到(9.4)中的一个表。我正在尝试将元数据存储为数据库中的类型 这是元数据类: 我使用以下迁移文件添加了列: 在中创建记录时出现此错误:错误:列“metadata”的类型为,但表达式的类型为提示:您需要重写或强制转换表达式。 这是我试图在db中持久化的请求主体: 请帮助如何转换类型为在javaSpring启动应用程序
我正在对地图执行firestore查询 没有人工作过,任何帮助都是感激的 谢谢你抽出时间
这是通过Hibernate、JPA和所有其他抽象层实现的。 PostgreSQL团队的“标准”建议是在SQL中使用。这对于使用查询生成器或ORM的人来说并不有用,特别是如果这些系统没有对诸如这样的数据库类型的显式支持,所以它们是通过应用程序中的进行映射的。 有些ORM允许实现自定义类型处理程序,但我并不想为每个ORM的每个数据类型编写自定义处理程序,例如Hibernate上的json、Eclips
我是颤振初学者。我得到这样的JSON响应时出错。 我一直在论坛上寻找这个问题,我发现是这样的。 但我不懂如何编写函数。这是我的密码。 还有像这样的错误。 我很抱歉问了同样的问题,因为我不明白
我有点被某些情况困住了。 1)