开发者社区> 问答> 正文

PostgreSQL中jsonb类型字段查找报错

PostgreSQL数据库中的jsonb类型字段有一个 @> 这样的操作符,用于在字段中查找指定的json串。

使用datagrip这样的数据库工具连接,执行语句正常。

但在使用数据库连接池的场景下则报错。

语句:

SELECT id FROM spoc_tj_course_class_teacher WHERE teacher_id_json::JSONB @> '"eb707a05-b082-4c9f-a391-10f916cee43e"';

相关错误提示如下:

com.alibaba.druid.sql.parser.ParserException: syntax error, error in :'SONB @> '"eb707a05-b082-4c9f-a391-1',expect VARIANT, actual VARIANT @ at com.alibaba.druid.sql.parser.SQLParser.printError(SQLParser.java:232) at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatementList(SQLStatementParser.java:407) at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatementList(SQLStatementParser.java:145) at com.alibaba.druid.wall.WallProvider.checkInternal(WallProvider.java:620) at com.alibaba.druid.wall.WallProvider.check(WallProvider.java:574) at com.alibaba.druid.wall.WallFilter.check(WallFilter.java:711) at com.alibaba.druid.wall.WallFilter.connection_prepareStatement(WallFilter.java:252) at com.alibaba.druid.filter.FilterChainImpl.connection_prepareStatement(FilterChainImpl.java:448) at com.alibaba.druid.filter.FilterAdapter.connection_prepareStatement(FilterAdapter.java:928) at com.alibaba.druid.filter.FilterEventAdapter.connection_prepareStatement(FilterEventAdapter.java:122) at com.alibaba.druid.filter.FilterChainImpl.connection_prepareStatement(FilterChainImpl.java:448) at com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl.prepareStatement(ConnectionProxyImpl.java:342) at com.alibaba.druid.pool.DruidPooledConnection.prepareStatement(DruidPooledConnection.java:331) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.apache.ibatis.logging.jdbc.ConnectionLogger.invoke(ConnectionLogger.java:55) at com.sun.proxy.$Proxy46.prepareStatement(Unknown Source) at org.apache.ibatis.executor.statement.PreparedStatementHandler.instantiateStatement(PreparedStatementHandler.java:87) at org.apache.ibatis.executor.statement.BaseStatementHandler.prepare(BaseStatementHandler.java:88) at org.apache.ibatis.executor.statement.RoutingStatementHandler.prepare(RoutingStatementHandler.java:59) at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:85) at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:62) at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:325) at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156) at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:109) at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:83) at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:148) at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:141) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:434) at com.sun.proxy.$Proxy31.selectList(Unknown Source) at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:231) at org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:128) at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:68) at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:53) at com.sun.proxy.$Proxy35.queryListCourseByTeacherId(Unknown Source) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:522) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1095) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:672) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1502) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1458) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:745)

原提问者GitHub用户imlizhiqiang

展开
收起
山海行 2023-07-05 21:48:26 106 0
3 条回答
写回答
取消 提交回答
  • 北京阿里云ACE会长

    可能有以下几个原因:

    查询条件语法错误
    如果查询条件语法错误,会导致查询无法执行。例如,查询条件中使用了未定义的变量、语法错误、拼写错误等。可以检查查询条件是否正确,并修正语法错误。

    jsonb字段不存在或为空
    如果jsonb字段不存在或为空,查询会返回空结果。可以检查表结构和数据是否正确,并确认查询的jsonb字段是否存在且不为空。

    查询条件中使用了不存在的jsonb字段
    如果查询条件中使用了不存在的jsonb字段,会导致查询无法执行。可以检查表结构和字段名是否正确,并确认查询的jsonb字段是否存在。

    查询条件中使用了jsonb字段的错误路径
    如果查询条件中使用了jsonb字段的错误路径,会导致查询无法执行。jsonb字段是一个嵌套的数据结构,可以通过.运算符访问其属性。可以检查查询条件中jsonb字段的路径是否正确,并确认访问的属性是否存在。

    查询条件中使用了不支持的jsonb操作符
    如果查询条件中使用了不支持的jsonb操作符,会导致查询无法执行。可以检查查询条件中jsonb操作符是否支持,并确认使用的操作符是否正确。

    2023-07-30 09:38:56
    赞同 展开评论 打赏
  • 值得去的地方都没有捷径

    这个问题可能是由于连接池或数据库驱动程序的解析器不支持jsonb数据类型的操作符引起的。根据错误提示,解析器在解析语句时遇到了问题。

    一种可能的解决方法是确保连接池和数据库驱动程序的版本支持jsonb数据类型和相关操作符。您可以查看连接池和数据库驱动程序的文档,以确定它们是否支持jsonb类型。

    另外,您还可以尝试使用不同的数据库驱动程序,或者直接使用原生的JDBC连接,以避免连接池可能引起的问题。

    如果问题仍然存在,您可以尝试使用转义字符来解决语法问题。例如,将双引号转义为双引号。您可以尝试以下语句:

    SELECT id FROM spoc_tj_course_class_teacher WHERE teacher_id_json::JSONB @> '\"eb707a05-b082-4c9f-a391-10f916cee43e\"';

    这样,双引号将被正确解析为字符串的一部分,而不是语法错误。

    希望这些信息对您有帮助。如果您有其他问题,请随时提问。

    2023-07-11 17:01:58
    赞同 展开评论 打赏
  • 问题已修复,请用新版本 https://github.com/alibaba/druid/releases/tag/1.1.14

    原回答者GitHub用户wenshao

    2023-07-06 12:22:34
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
云栖大会:开源 PolarDB 架构演进、关键技术与社区建设 立即下载
2023云栖大会:和客户一起玩转PolarDB新特性 立即下载
2023云栖大会:PolarDB for AI 立即下载

相关镜像