首页 > 解决方案 > 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

花了几天时间为其他人寻找类似的问题,但无济于事。如果有人可以提供帮助,不胜感激,谢谢!

标签: oraclespring-boothibernateintegration-testingh2

解决方案


H2 不支持访问 JSON 属性。有关支持的功能列表,请参见此处:https ://www.h2database.com/html/functions.html


推荐阅读