我有这样的结构
车辆品牌
@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
2条答案
按热度按时间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模型可能如下所示:
查询就是将实体视图应用到查询中,最简单的查询就是按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
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对象,希望这个解决方案能帮助到别人。