我正在开发一个Spring引导REST应用程序,它必须支持遗留数据库,但实现了新的功能。
我想调用一个数据库JPQL查询,它返回存储库聚合实体中的完整值,但也返回来自其他实体的多个单个值。
因为查询给出了一个对象列表,每个对象都有自己来自其他实体的关联值,所以我不能简单地创建一个列表
我有简单的实体,但不能将任何连接直接放入实体中。这一切都必须在存储库/服务中完成。
所以我的想法是定义一个这样的接口:
public interface OfferWithDate{
Offer getOffer();
LocalDateTime getExpirationDate();
String getPictureUrl
}
使用这样的存储库:
public interface OfferRepository extends JpaRepository<Offer, Integer> {
@Query(value = "SELECT o, b.expirationDate, p.pictureUrl FROM OfferEntity o +
"left join BackPackEntity b on o.prsId = b.prsId +"
"left join PictureEntity p on o.prsId = p.prsId +"
"where o.accessable = 2 and b.visible = true ")
List<OfferWithDate> getAllProfiles();
我希望它由我的RESTController返回,类似于这样(如果它看起来不同,请原谅。但我需要它是一个完全序列化的JSON):
[
[
{
OfferId: 1,
prsId: 1
}
{
expirationDate: "2021-12-25T09:53:14.27"
}
{
pictureUrl: "https://1234.com"
}
]
]
我尝试的任何东西都会给我留下所有值都为null
的JSON响应(因为它需要我的接口,不能将任何值映射到它)。我不能从其他实体添加值,也不能将整个实体映射到接口。
我设法找到了解决办法。
缺少的部分是在数据库查询中定义一个自定义名称:
...SELECT o as offer, b.expirationDate as exDate, p.pictureUrl as picUrls FROM...
接口必须与给定的名称匹配,但仍然可以看起来像这样:
public interface OfferWithDate{
Offer getOffer();
LocalDateTime getExDate();
String getPicUrl();
}
我希望这有助于任何人正在寻找这个:)