将数组列映射到 Projection 接口:没有 JDBC 类型的方言映射:2003

Goo*_*ogi 6 java postgresql spring hibernate jpa

我正在尝试将带有联接的本机查询的结果映射到不是实体的投影(接口)。我必须将 Postgres数组 codes| text[]|映射 到String[] getCodes();投影界面。使用 Entity,可以轻松映射定义下面的类型,然后注释属性

     @TypeDef(
         name = "string-array",
         typeClass = StringArrayType.class
     )
 }) 
Run Code Online (Sandbox Code Playgroud)

但同样的方法似乎不适用于预测。有没有什么方法可以对投影执行相同的操作,而无需将数组转换为查询本身中的文本?

Chr*_*kov 0

您的本机查询是做什么的,也许您可​​以在 JPA/Hibernate 之上使用Blaze-Persistence Entity Views,而不是留在 JPA 模型的领域?

Blaze-Persistence 是基于 JPA 的查询生成器,它支持基于 JPA 模型的许多高级 DBMS 功能。我在其之上创建了实体视图,以允许在 JPA 模型和自定义接口定义的模型之间轻松映射,就像类固醇上的 Spring Data Projections 一样。这个想法是,您按照自己喜欢的方式定义目标结构,并通过 JPQL 表达式将属性(getter)映射到实体模型。由于属性名称用作默认映射,因此您通常不需要显式映射,因为 80% 的用例都拥有作为实体模型子集的 DTO。

模型的 DTO 映射可能看起来像下面一样简单

@EntityView(SomeEntity.class)
interface SomeEntityProjection {
    Integer getId();
    String[] getCodes();
}
Run Code Online (Sandbox Code Playgroud)

查询是将实体视图应用于查询,最简单的就是通过 id 进行查询。

SomeEntityProjection dto = entityViewManager.find(entityManager, SomeEntityProjection.class, id);

但是 Spring Data 集成允许您几乎像 Spring Data Projections 一样使用它:https://persistence.blazebit.com/documentation/entity-view/manual/en_US/index.html#spring-data-features

它只会获取您告诉它获取的映射。