使用 Hibernate 从 PostgreSQL 中的 JSONArray 获取对象的问题

Posted

技术标签:

【中文标题】使用 Hibernate 从 PostgreSQL 中的 JSONArray 获取对象的问题【英文标题】:Problem in getting object from JSONArray in PostgreSQL using Hibernate 【发布时间】:2019-02-15 15:18:52 【问题描述】:

我想在 Spring Boot 应用程序中使用 Hibernate 从 PostgreSql 数据库的查询返回值的 JsonArray 中检索一个对象。但是我遇到了一个异常 '>' is unexpected token,尽管我的查询在 pgAdmin4 查询工具中运行良好,下面是我的代码 sn-p。

@PersistenceContext
private EntityManager entityManager;

@Transactional
public String getItemById(Long id) 
    String result = (String) entityManager.createQuery("SELECT JSON_AGG(items)->>0 AS item FROM items WHERE id=:id").setParameter("id", id)
            .getResultList().get(0);

    System.out.println(result);
    return result;

异常如下:

org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: > near line 1, column 24 [SELECT JSON_AGG(items)->>0 AS item FROM items WHERE id=:id]; nested exception is java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: > near line 1, column 24 [SELECT JSON_AGG(items)->>0 AS item FROM items WHERE id=:id]
    at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:367)

请帮助实现这一目标或建议我在不更改查询的情况下解决问题。提前致谢。

【问题讨论】:

JSON_AGG(items)->>0 语法是什么? 一个 postgres 实用函数,用于将查询结果转换为 json 对象数组。 我知道JSON_AGG 函数是什么。但是->>0 是干什么用的?我不知道那个语法。而 postgres 显然也... 从 json 数组中检索第一个对象 【参考方案1】:

您使用的 API 方法 (entityManager.createQuery(String)) 是按照 javadoc 中的说明执行 JPQL 查询:

创建 Query 实例以执行 Java Persistence 查询语言语句。

您要执行的查询是 SQL 查询。您应该在EntityManager 上使用createNativeQuery(String) 方法。

【讨论】:

以上是关于使用 Hibernate 从 PostgreSQL 中的 JSONArray 获取对象的问题的主要内容,如果未能解决你的问题,请参考以下文章

使用 PostgreSQL 的 Hibernate import.sql 重复主键

使用 JPA/Hibernate 将 Spring Boot 连接到 PostgreSql 数据库时失败

如果我将数据源从 `H2` 切换到 `postgresql`,`hibernate.hbm2ddl.import_files` 属性将停止工作

使用 Hibernate 注释映射 PostgreSQL 串行类型

如何使用 JPA 和 Hibernate 映射 PostgreSQL 枚举

Hibernate使用PostgreSQL序列不影响序列表