You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot 2.7.5+PostgreSQL执行JPA原生查询遇JDBC类型1111映射错误

问题描述

基于Spring Boot 2.7.5搭配PostgreSQL开发的应用,执行原生JPA查询时抛出No Dialect mapping for JDBC type: 1111错误,相关细节如下:

相关代码

原生JPA查询

@Query(value = """select import, export from
           (select cast(max(sd.value) - min(sd.value) as float8)
            from solar_data sd
            where sd.device_address = :deviceAddress
              and sd.tstamp between :from and now()) as import,
           (select cast(max(sd.value) - min(sd.value) as float8)
            from solar_data sd
            where sd.device_address = :deviceAddress
              and sd.tstamp between :from and now ()) as export
 """, nativeQuery=true)
 fun getMainScreenData(@Param("deviceAddress") deviceAddress:Long, @Param("from") 
       from:LocalDateTime) : List<Impex>

结果映射接口

interface Impex {
    fun getImport():Float
    fun getExport():Float
}

错误栈信息

org.hibernate.MappingException: No Dialect mapping for JDBC type: 1111
org.hibernate.dialect.TypeNames.get(TypeNames.java:71)
org.hibernate.dialect.TypeNames.get(TypeNames.java:103)
org.hibernate.dialect.Dialect.getHibernateTypeName(Dialect.java:741)

当前JPA方言配置

spring:
   jpa:
      databasePlatform:  org.hibernate.dialect.PostgreSQL10Dialect 

用户已尝试将SQL结果转为float和float8,问题仍未解决。


解决方法

1. 修正SQL语法错误

原SQL的写法会被PostgreSQL解析为笛卡尔积查询,返回的结果结构不符合预期,导致Hibernate无法识别类型。正确写法是将两个子查询作为同一行的两个列:

select 
    (select cast(max(sd.value) - min(sd.value) as float8)
     from solar_data sd
     where sd.device_address = :deviceAddress
       and sd.tstamp between :from and now()) as import,
    (select cast(max(sd.value) - min(sd.value) as float8)
     from solar_data sd
     where sd.device_address = :deviceAddress
       and sd.tstamp between :from and now()) as export

2. 对齐结果类型与接口定义

PostgreSQL的float8对应Java的Double类型,而原接口使用Float会导致类型映射不兼容,修改接口:

interface Impex {
    fun getImport(): Double
    fun getExport(): Double
}

3. 可选:优化查询逻辑(提升性能)

如果两个子查询逻辑完全一致,可合并为单次查询减少数据库访问:

select 
    cast(max(sd.value) - min(sd.value) as float8) as import,
    cast(max(sd.value) - min(sd.value) as float8) as export
from solar_data sd
where sd.device_address = :deviceAddress
  and sd.tstamp between :from and now()

4. 可选:匹配PostgreSQL版本升级方言

若使用的PostgreSQL版本高于10,可对应升级方言(如PostgreSQL 12+用org.hibernate.dialect.PostgreSQL12Dialect),避免潜在版本兼容问题。


内容的提问来源于stack exchange,提问作者zamek 42

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 06:20:47