postgresql 如何使用标准生成器进行选择

pxiryf3j  于 2022-12-12  发布在  PostgreSQL
关注(0)|答案(1)|浏览(150)

我要查询以下PSQL脚本,但使用标准生成器:

PostgreSQL数据库

SELECT ts.domain, ts."data" -> 'id' as id FROM myScheme.myServiceTable ts;
到目前为止,我已经尝试过使用条件,但它总是抛出一个恼人的错误消息

标准生成器代码

public final CriteriaQuery<Object[]> getServiceInfo() {

    final CriteriaBuilder builder = entityManager.getCriteriaBuilder();
    final CriteriaQuery<Object[]> criteria = builder.createQuery(Object[].class);
    final Root<ServiceTable> rootBooking = criteria.from(ServiceTable.class);

    criteria.multiselect(
         builder.function("jsonb_extract_path_text", 
                           String.class, 
                           rootBooking.get("data"), 
                           builder.literal("id")
         ).alias("id"),
         rootBooking.get("domain")
    );
}

错误消息:

org.hibernate.QueryException: No data type for node: org.hibernate.hql.internal.ast.tree.MethodNode \r\n \\-[METHOD_CALL] MethodNode: 'function (jsonb_extract_path_text)'\r\n    +-[METHOD_NAME] IdentNode: 'jsonb_extract_path_text' {originalText=jsonb_extract_path_text}\r\n    \\-[EXPR_LIST] SqlNode: 'exprList'\r\n

如果有人知道我如何查询我之前提到的,我将不胜感激。

fkaflof6

fkaflof61#

如果要在select子句中使用Hibernate未知的函数,则必须转换表达式:

builder.function(
    "jsonb_extract_path_text", 
    Integer.class, // Some other type so that casting works
    rootBooking.get("data"), 
    builder.literal("id")
).as(String.class).alias("id")

在Hibernate 6中,这是不必要的了。如果你不想强制转换,那么在Dialect中将函数注册为SQLFunction

相关问题