当前位置: 首页 > 知识库问答 >
问题:

org.postgresql.util.PSQLException: ERROR:列"tags"是jsonb类型,但表达式的类型不同

靳举
2023-03-14

在我将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?

共有1个答案

西门嘉石
2023-03-14

最后添加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)