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



我有一个基于spring引导的应用程序,包含hibernate-types,以正确地将Postgres数组映射到JPA实体。它工作得很好,但是当我想创建一个CriteriaQuery时,我遇到了一个问题。

sql模式如下:

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

此外,我已经为这个表创建了一个完美的JPA实体,我想用JPA创建以下类型安全的标准查询:

select external_id, cardinality(ts_values)
from my_values
where external_id = 'my_extermal_id'

使用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();

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

. lang。NullPointerException:无法调用"org.hibernate.type.Type.getColumnSpan (org.hibernate.engine.spi.Mapping)";因为"类型[我]";为空org.hibernate.hql.internal.NameGenerator.generateColumnNames (NameGenerator.java: 27)在org.hibernate.hql.internal.ast.util.SessionFactoryHelper.generateColumnNames (SessionFactoryHelper.java: 434)

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

解决方案:

您应该创建一个MetadataBuilderContributor实现,并在您的属性

中设置hibernate.metadata_builder_contributor

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

您应该创建一个MetadataBuilderContributor实现,并在您的属性

中设置hibernate.metadata_builder_contributor

了解更多细节:如何在Spring Boot应用程序中手动注册非标准化SQL函数?

相关内容

  • 没有找到相关文章

最新更新