在 CriteriaQuery 多选中使用自定义函数调用会导致空指针异常

Syn*_*ity 5 java hibernate jpa

我有一个基于 Spring Boot 的应用程序,其中hibernate-types包含将 Postgres 数组正确映射到 JPA 实体。它工作正常,但当我想创建 CriteriaQuery 时遇到问题。

sql 架构如下:

create table if not exists my_values
    (
        id          bigserial,
        external_id varchar(255),
        ts_values   double precision[]
    );
Run Code Online (Sandbox Code Playgroud)

另外,我已经为该表提供了一个完美运行的 JPA 实体,并且我想使用 JPA 创建以下类型安全的条件查询:

select external_id, cardinality(ts_values)
from my_values
where external_id = 'my_extermal_id'
Run Code Online (Sandbox Code Playgroud)

使用 JPA 标准 API 编写查询非常简单,但每当我尝试运行查询时,它都会产生空指针异常。

到目前为止的java代码:

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<MyData> query = cb.createQuery(MyData.class);
Root<MyDataEntity> root = query.from(MyDataEntity.class);

query.multiselect(
    root.get(MyDataEntity_.externalId),
    cb.function("cardinality", Integer.class, root.get(MyDataEntity_.values))
);

query.where(cb.equal(root.get(MyDataEntity_.externalId), id));

return em.createQuery(query).getSingleResult();
Run Code Online (Sandbox Code Playgroud)

正如我提到的,实体实现工作正常,我可以完美地保存和读取数据,MyData类也具有适当的构造函数。当我通过简单地选择整个数组来替换 cb.function 调用时,它也工作得很好,我怀疑在多选中使用一个函数会导致问题。

java.lang.NullPointerException:无法调用“org.hibernate.type.Type.getColumnSpan(org.hibernate.engine.spi.Mapping)”,因为“types[i]”在org.hibernate.hql.internal.NameGenerator处为空。 org.hibernate.hql.internal.ast.util.SessionFactoryHelper.generateColumnNames(NameGenerator.java:27) 处的generateColumnNames(SessionFactoryHelper.java:434)

我尝试向函数表达式添加别名和显式类型声明,.as(Integer.class).alias("value")但这并不能解决问题,我得到了相同的异常。我不知道我做错了什么,甚至可以做吗?

解决方案:

您应该创建一个在属性中MetadataBuilderContributor设置的实现hibernate.metadata_builder_contributor

详细信息: 如何在 Spring Boot 应用程序中手动注册非标准化 SQL 函数?

Syn*_*ity 0

您应该创建一个在属性中MetadataBuilderContributor设置的实现hibernate.metadata_builder_contributor

详细信息:如何在 Spring Boot 应用程序中手动注册非标准化 SQL 函数?