Spring Boot JPA:如何查询表中的 JSON 列

Kee*_*thi 5 mysql json spring-data-jpa spring-boot

我有一张桌子casemessage,有以下列。我正在尝试JSON使用Spring Framework JPA..

  1. ID
  2. 由...制作
  3. created_utc
  4. from_id
  5. 信息
  6. 地位
  7. 案例ID

这里的status列存储JSON字符串列表。例如:

 1. [{"user_id": 1, "status": "sent"}, {"user_id": 2, "status": "delete"}]
 2. [{"user_id": 3, "status": "delete"}, {"user_id": 2, "status": "sent"},{"user_id": 1, "status": "received"}]
 3. [{"user_id": 1, "status": "received"}, {"user_id": 2, "status": "sent"}]
 4. [{"user_id": 1, "status": "delete"}, {"user_id": 3, "status": "sent"}]
Run Code Online (Sandbox Code Playgroud)

我想查询casemessage表把所有的行,其中user_id1statusdelete

使用MySQL查询,我可以查询表并获得预期的结果。

这是我尝试过的查询:

 select * from casemessage  where case_Id=1 and id not in(select id from cwot.casemessage where json_contains(status, '{"status" :"delete"}') and json_contains(status, '{"user_id" : 1}'));
Run Code Online (Sandbox Code Playgroud)

当我使用Spring Framework JPA( Spring Boot)尝试此操作时,运行应用程序时出现异常。这是我绑定的声明:

    @Query("select c from CaseMessage c  where c.caseId=?1 and c.id not in(select cm.id from CaseMessage cm where json_contains(status, '{\"status\": \"delete\"}') and json_contains(status, '{\"user_id\": ?2}'))")
    List<CaseMessageResponse> getAllCaseMessages(long caseId, long userId);
Run Code Online (Sandbox Code Playgroud)

我回来的错误是:

 Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected AST node: ( near line 1, column 172 [select c from com.cwot.domain.CaseMessage c  where c.caseId=?1 and c.id not in(select cm.id from com.cwot.domain.CaseMessage cm where json_contains(status, '{"status": "delete"}') and json_contains(status, '{"user_id": ?1}'))]
Run Code Online (Sandbox Code Playgroud)

有人可以帮我弄这个吗。?

任何帮助都非常感谢。

小智 8

您必须使用本机查询才能使用 json_contains 等数据库函数:

@Query("select c from CaseMessage c  where c.caseId=?1 and c.id not in(select cm.id from CaseMessage cm where json_contains(status, '{\"status\": \"delete\"}') and json_contains(status, '{\"user_id\": ?2}'))", nativeQuery = true)
    List<CaseMessageResponse> getAllCaseMessages(long caseId, long userId);
Run Code Online (Sandbox Code Playgroud)

或使用@NativeQuery 注释

想要查询更多的信息 :

查询、原生查询、命名查询和类型查询的区别