繁体   English   中英

我可以 map 对不是实体的 class 进行休眠/jpa 查询的结果吗?

[英]Can I map the result of a hibernate/jpa query to a class that is not an entity?

我正在尝试使用 Springboot,我有几个具有非常相似的属性的实体,例如:实体“汽车”具有 model 和价格属性,“摩托车”model 也是如此。 我想使用 aa class 来定义那些常见的属性,class “车辆”,属性为 model 和价格。

换句话说:

Car                             Motorcicle                             Vehicle
price                              price                                price
model                              model                                 model
year                              year
color                              color
fuel_type                         fuel_type
... 30 more properites                ...30 more properties

我想使用车辆 map 搜索汽车和摩托车表之间的 SQL 联合的搜索结果。

public interface ImovelRepositorio extends JpaRepository<Vehicle, Long> {

      @Query(value = "here select query with union between car and motorcycle", nativeQuery = true)
  List<Vehicle> searchVehicle();

}

这里的 Vehicle class 是没有任何注释的普通 class。 我收到错误消息说 Vehicle 不是托管类型。 当然我的存储库没有意义,我预计会出现这个错误。 但是我怎样才能实现我想要的呢?

当我执行联合时,我没有得到模型列表,而是得到一个或多个模型的列表。 我想创建一个 class 来“组合”搜索结果。

您可以使用@MappedSuperClass,其中车辆可以是映射的超级 class。 其余的类可以扩展它。 有点像下面:

超级class:

@MappedSuperClass
class Vehicle {
// constructor, getters, setters 
}

实体类:

@Entity
class Car extends Vehicle {
// constructor, getters, setters 
}

@Entity
class MotorCicle extends Vehicle {
// constructor, getters, setters 
}

FluentJPA 有针对这种情况的解决方案

我看到你使用 SpringData JPA。 在 JPQL 中,您可以通过select new fully.qualified.name.of.your.Class(field1, field2) from Entity等来实现这一点。您必须在 class fully.qualified.name.of.your.Class中有适当的构造函数. 这个 class 不必是@Entity - 它可以是任何常见的 POJO 或任何你想要的东西。

但是,我看到您也使用本机查询。 对于本机查询,这将不起作用 - 您必须将返回类型声明为List<Object[]>并自己进行映射,或者将@NamedNativeQuery@SqlResultSetMapping一起使用。 但是你真的需要一个本地查询吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM