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
您应该创建一个在属性中MetadataBuilderContributor
设置的实现hibernate.metadata_builder_contributor
详细信息:如何在 Spring Boot 应用程序中手动注册非标准化 SQL 函数?
归档时间: |
|
查看次数: |
3034 次 |
最近记录: |