当前位置: 首页 > 知识库问答 >
问题:

使用两个表的数据进行Jpa连接查询,org.hibernate。MappingException:没有JDBC类型的方言映射:2002

楚洋
2023-03-14

我有这个结构

车辆品牌

@Entity
@Getter
@Setter
public class VehicleBrand {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    private String otherInfo;
}

车辆模型

@Entity
@Getter
@Setter
public class VehicleModel {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne
    private VehicleBrand brand;

    private String name;

    private String otherInfo;
}

我还想使用Dto对象,因为我想得到一个连接查询,它将从两个表返回数据,

ModelDto

@Getter
@Setter
public class ModelDto {

    private Long id;
    private String name;
    private long brand_id;
}


@Getter
@Setter
public class VehicleBrandModelDto {

    private Long id;
    private String name;
    List<ModelDto> model;
}

我想用jpa执行的查询是

选择vb.id,vm从vehicle_brandvb加入vehicle_modelvm onvb.id=vm.brand_id组vb.id,vb,vm,vm.brand_id;

现在,当我在数据库上执行此命令时,我有1122条记录。但只有85个不同的汽车品牌

我希望得到的结果是一个公共类车辆的列表。

    private Long id;
    private String name;
    List<ModelDto> model;
}

其中有85个品牌,每个对象内部都有属于该品牌的模型列表。

Currently i have tried the following solutions 

@Repository
public class VehicleBrandRepository {

    @Autowired
    private EntityManager entityManager;

    public List getSuggestionList() {
        Query nativeQuery = entityManager.createNativeQuery("select vb.name, vm as model from 
      vehicle_brand  vb join vehicle_model vm on vb.id = vm.brand_id group by vb.name, vm");
        return nativeQuery.getResultList();
    }
//    public List<VehicleBrandModelDto> getSuggestionList() {
//        Query nativeQuery = entityManager.createQuery("select vb.id, vb.name, vm as model from 
         VehicleBrand  vb join VehicleModel vm on vb.id = vm.brand.id group by vb.id, vb.name, vm");
//        return nativeQuery.getResultList();
//    }
}

使用createQuery的第二个解决方案给出了1122条记录的结果,我尝试使用流api对这些记录进行分组,但我遇到了类强制转换异常,第一个查询返回了错误

org.springframework.orm.jpa.JpaSystemException: No Dialect mapping for JDBC type: 2002; nested exception is org.hibernate.MappingException: No Dialect mapping for JDBC type: 2002

任何建议,我如何能实现这一点或这可能是不可能的?

数据库属性

spring.datasource.url=jdbc:postgresql://changed.compute-1.amazonaws.com:5432/changed
spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=false
spring.datasource.username=changed
 spring.datasource.password=changed
spring.jpa.properties.hibernate.hbm2ddl.auto=update
spring.jpa.properties.connection.pool_size=17
spring.jpa.properties.hibernate.dialect =org.hibernate.dialect.PostgreSQLDialect
spring.datasource.driverClassName=org.postgresql.Driver

数据库版本postgress 12

共有1个答案

方季同
2023-03-14

不知道为什么你会得到这个没有方言映射的 JDBC 类型: 2002 错误。你能发布整个堆栈跟踪吗?这通常建议您使用在方言中没有注册匹配的Hibernate类型的SQL类型。类型代码 2002 引用 STRUCT 类型,但您发布的模型不包含任何外来类型。我猜 VehicleModel 还有其他一些属性,这些属性使用的类型未正确注册。您能展示车辆模型的完整映射吗?

您可能还会喜欢Blaze-Persistence实体视图所提供的功能。

我创建了这个库,以允许在JPA模型和自定义接口或抽象类定义模型之间轻松映射,就像类固醇上的Spring Data Projections一样。这个想法是,你按照你喜欢的方式定义你的目标结构(域模型),并通过JPQL表达式将属性(getters)映射到实体模型。

对于Blaze持久性实体视图,用例的DTO模型可能如下所示:

@EntityView(VehicleBrand.class)
public interface VehicleBrandModelDto {
    @IdMapping
    Long getId();
    String getName();
    // Use this if you have an inverse one-to-many
    @Mapping("models")
    // Otherwise you can also do ad-hoc joins
    // @Mapping("VehicleModel[brand.id = VIEW(id)]")
    List<ModelDto> getModel();

    @EntityView(VehicleModel.class)
    interface ModelDto {
        @IdMapping
        Long getId();
        String getName();
        @Mapping("brand.id")
        long getBrandId();
    }
}

查询是将实体视图应用于查询的问题,最简单的方法是按 id 进行查询。

车辆模型a=entityViewManager.find(entityManager,VehicleBrandModelDto.class, id);

Spring数据集成让您可以像使用Spring数据投影一样使用它:https://persistence.blazebit.com/documentation/entity-view/manual/en_US/index.html#spring-数据特征

List<VehicleBrandModelDto> findAll();
 类似资料:
  • 我在启动Web服务器时遇到上述错误。我用 enum 映射和 enity 类。类似... 是什么问题,我在配置中遗漏了什么吗?谢谢!!

  • 问题内容: 我正在使用MySQL作为数据库的Spring JPA应用程序。我确保已加载所有spring-jpa库,hibernate和mysql-connector- java。 我正在运行mysql 5实例。这是我的application.properties文件的摘录: 执行集成测试时,spring可以正常启动,但无法创建hibernate的SessionFactory,但以下情况除外: 我认

  • 虽然这个标题存在一些问题,但我的查询无法从这些线程中解决。 我在postgres中通过hibernate执行递归(使用with子句)查询,查询结果也包含搜索路径 ex:一行查询结果 Hibernate是否具有除字符串以外的的任何映射类型,类似于或。 下面是查询输出的示例 Hibernate正在抛出异常 原因:org.hibernate.MappingException:没有JDBC类型的方言映射:

  • 问题内容: 尽管此标题存在一些问题,但我的查询并没有从那些线程中解决。 我正在通过postgres中的hibernate执行递归查询(与子句一起使用),查询结果也包含搜索路径 例如:查询结果的一行 hibernate状态是否具有String以外的任何映射类型,类似于或。 下面是查询输出的示例 Hibernate抛出异常 原因:org.hibernate.MappingException:没有JDB

  • 我正在开发一个Spring JPA应用程序,使用MySQL作为数据库。我确保加载了所有spring-jpa库、hibernate和mysql-connector-java。 期待您的回答,谢谢! 顺便说一句,应用程序已经在使用spring Boot了。

  • 为了处理运行Kotlin/SpringBoot应用程序时出现的以下错误(完整堆栈跟踪),我一直在咨询一些方法/帖子/堆栈溢出问题: 问题在于用Hibernate映射PostgreSQL的JSONB数据类型。 我广泛尝试和调试的两种方法如下: 实现自定义Hibernate映射并为JSONB创建自定义用户类型。参考文献:这里,这里,这里和这里 使用Hibernate类型。参考文献在这里,这里和这里 我