原生查询映射非实体Projection接口时Postgres数组映射问题
解决Postgres text[]映射到Projection接口String[]的问题
这个报错No Dialect mapping for JDBC type: 2003本质是Hibernate默认的PostgreSQL方言没有为JDBC数组类型(代码2003对应ARRAY类型)注册对应的Java类型映射,而实体类里的@TypeDef只对实体属性生效,Projection接口不会继承这个配置。下面给你两个不用手动转换数组的解决方案:
方案1:扩展PostgreSQL方言,全局注册数组映射(推荐)
这是一劳永逸的方法,配置后所有地方(包括Projection)都能自动把Postgres的text[]映射成Java的String[]:
- 先写一个自定义的方言类,继承默认的PostgreSQLDialect,在构造方法里注册类型映射:
import org.hibernate.dialect.PostgreSQLDialect; import org.hibernate.type.StringArrayType; public class CustomPostgreSQLDialect extends PostgreSQLDialect { public CustomPostgreSQLDialect() { super(); // 把JDBC类型2003(ARRAY)和Hibernate的StringArrayType绑定 registerHibernateType(2003, StringArrayType.class.getName()); } }
- 然后在你的Spring Boot配置文件里指定使用这个自定义方言:
spring.jpa.properties.hibernate.dialect=com.yourpackage.CustomPostgreSQLDialect
(记得把com.yourpackage换成你实际的包路径)
配置完之后,你直接执行原生查询并映射到Projection接口,getCodes()方法就能正确拿到String[]数组了,完全不用修改查询语句。
方案2:在Projection方法上直接指定类型(兼容性稍差)
如果你的Spring Data JPA版本支持,也可以直接在Projection接口的方法上添加@Type注解来指定类型处理器:
import org.hibernate.annotations.Type; import org.hibernate.type.StringArrayType; public interface YourProjection { // 其他属性的get方法... @Type(type = "string-array") String[] getCodes(); }
不过要注意,这种方式依赖Spring Data对Hibernate注解的支持程度,有些旧版本可能不生效,所以优先推荐方案1。
内容的提问来源于stack exchange,提问作者Googi
相关产品推荐
相关产品推荐

