【问题标题】:Map array column to Projection interface: No Dialect mapping for JDBC type: 2003将数组列映射到 Projection 接口:没有 JDBC 类型的方言映射:2003
【发布时间】:2020-11-29 05:51:29
【问题描述】:

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

     @TypeDef(
         name = "string-array",
         typeClass = StringArrayType.class
     )
 }) 

但同样的情况似乎不适用于预测。 有没有办法在不将数组转换为查询本身的文本的情况下对投影做同样的事情?

【问题讨论】:

  • 你尝试在接口上使用@TypeDef还是它的getter?

标签: java spring postgresql hibernate jpa


【解决方案1】:

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

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

模型的 DTO 映射可能如下所示简单

@EntityView(SomeEntity.class)
interface SomeEntityProjection {
    Integer getId();
    String[] getCodes();
}

查询是将实体视图应用于查询的问题,最简单的就是通过 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

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

【讨论】:

    猜你喜欢
    • 2014-03-05
    • 2021-09-21
    • 1970-01-01
    • 2021-10-06
    • 2014-08-08
    • 2015-03-27
    • 2023-03-17
    相关资源
    最近更新 更多