oracle - H2 数据库集成测试中的 SQLGrammar 异常
问题描述
@Query(nativeQuery = true, value = "SELECT *\n" +
"FROM TDED_VISITS v \n" +
"WHERE v.v_collected_data.assigneeId = ?")
List<Visit> findAllByAssigneeId(String assigneeId);
上面的代码在存储库中使用,查询的目的是返回所有与提供的值具有匹配值的“访问”。此值是 Oracle 数据库中 CLOB 中 JSON 对象内部的单个值,如下所示。
{"visitId" : 1, "assigneeId" : "agr512"}
该模型是使用以下相关字段制作的。
@Column(name = "V_COLLECTED_DATA")
@Lob
private String visitJsonString;
日志中的错误如下
Column "V.V_COLLECTED_DATA.ASSIGNEEID" not found; SQL statement:
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessResourceUsageException: could not prepare statement; SQL [SELECT *
FROM TDED_VISITS v
WHERE v.v_collected_data.assigneeId = ?]; nested exception is org.hibernate.exception.SQLGrammarException: could not prepare statement
还尝试了以下 SQL 查询,但给出了未找到函数 JSON_VALUE 的错误。
@Query(nativeQuery = true, value = "SELECT *\n" +
"FROM TDED_VISITS v \n" +
"WHERE JSON_VALUE(V_COLLECTED_DATA, '$.assigneeId') = ?")
Caused by: org.springframework.orm.jpa.JpaSystemException: could not prepare statement; nested exception is org.hibernate.exception.GenericJDBCException: could not prepare statement
花了几天时间为其他人寻找类似的问题,但无济于事。如果有人可以提供帮助,不胜感激,谢谢!
解决方案
H2 不支持访问 JSON 属性。有关支持的功能列表,请参见此处:https ://www.h2database.com/html/functions.html
推荐阅读
- php - 如何从数组中获取元素?
- html - 我可以创建一个在 ngStyle 或 ngClass 中工作的数组吗?
- mongodb - mule4 with mongodb - “查找一个并更新文档”连接器:“$inc”中的美元($)前缀字段“$inc”对存储无效
- mysql - 如何在给定条件的 MySQL 中更新列中的数字?
- c# - NUnit 构建错误'缺少编译器所需的成员 System.Range.get_Start'
- java - 无法使用使用 HTTPS 的 AWS S3 Java API 访问 S3 上的存储桶
- java - 如何使用firebase登录令牌?
- python - 使用 Python 在多个网站中自动填写表单
- excel - 当所有未完成的引用都消失时,如何确保 Excel 将关闭
- reactjs - 酶浅渲染子组件,包升级时的行为改变