我有一个基于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函数?