Jpa Join查询来自两个表的数据,org.hibernate.MappingException:JDBC类型没有方言Map:2002

oalqel3c  于 2023-03-30  发布在  其他
关注(0)|答案(2)|浏览(160)

我有这样的结构
车辆品牌

@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从车辆品牌vb加入车辆型号vm在vb. id = vm.品牌id组通过vb.id,vb,vm,vm.品牌id;
现在,当我在数据库上执行这个命令时,我有1122条记录,但是只有85个不同的汽车品牌
我希望得到的结果是public class VehicleBrandModelDto {

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

DB版本postgress 12

bweufnob

bweufnob1#

不知道为什么你会得到这个No Dialect mapping for JDBC type: 2002错误。你能发布整个堆栈跟踪吗?这通常意味着你使用的SQL类型在方言中没有匹配的Hibernate类型。类型代码2002引用STRUCT类型,但是你发布的模型不包含任何外来类型。我猜VehicleModel有一些其他的属性使用了一个没有正确注册的类型。你能展示VehicleModel的完整Map吗?
您可能还喜欢Blaze-Persistence实体视图所提供的功能。
我创建这个库是为了在JPA模型和定制接口或抽象类定义的模型之间进行简单的Map,就像Spring Data Projections一样,其思想是您可以按照自己喜欢的方式定义目标结构(域模型),并通过JPQL表达式将属性(getter)Map到实体模型。
使用Blaze-Persistence Entity-Views时,您的用例的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查询。
VehicleBrandModelDto a = entityViewManager.find(entityManager, VehicleBrandModelDto.class, id);
Spring Data 集成允许您像使用Spring Data 投影一样使用它:https://persistence.blazebit.com/documentation/entity-view/manual/en_US/index.html#spring-data-features

List<VehicleBrandModelDto> findAll();
dgiusagp

dgiusagp2#

我遇到了同样的问题,而我有特别相同的查询(如上所述):“selectvb.name,vm as model from vehicle_brand vb join vehicle_model vm onvb.id= vm.brand_id group byvb.name,vm“
因此,从这个查询中,您试图获取vehicle_brand_name和vehicle_model对象以及错误:“JDBC类型没有DialectMap:当查询试图返回vehicle_model对象时,抛出“2002”,因此您使用的实际方言无法Map它。一个解决方案可能是更改查询,而不是像您正在做的那样返回完整的vehicle_model:“选择vb.name,vm为模型
from vehicle_brand vb join vehicle_model vm onvb.id= vm.brand_id group byvb.name,vm“,
你把它改成:“选择vb.name,vm.name作为vehicle_name,vm.other_info作为vehicle_other_info
from vehicle_brand vb join vehicle_model vm onvb.id= vm.brand_id group byvb.name,vm“,所以我们的想法是一个接一个地返回vehicle_model字段,这样你就可以单独得到vehicle_model结果,一旦你从查询中得到结果,你就可以创建你的VehicleModel对象,希望这个解决方案能帮助到别人。

相关问题