我正在开发一个Sping Boot REST应用程序,它必须支持遗留数据库,但实现了新的功能。
我想调用一个数据库JPQL查询,它返回存储库中的全部聚合实体,但也返回来自其他实体的多个单个值。
因为查询给出了一个对象列表,每个对象都有自己的与其他实体相关联的值,所以我不能简单地创建一个List<>
作为返回类型。我读了Sping Boot Data JPA预测。所以我的想法是定义一个接口,包含不同的类型作为getter。投影将是一个很好的解决方案,但我不知道如何编写一个投影接口,包括来自不同实体的多个值,甚至整个实体对象,同时将其用作spring-boot存储库中的返回类型。
问题是,我只能从存储库声明中包含的实体中获取值,但我需要很多不同的实体。它可以使用tpye Object
,但我认为这是一个不好的做法,并且在交付的JSON中没有附加值。
我有简单的实体,但不能把任何连接直接到实体。这一切都必须在存储库/服务中完成。
所以我的想法是定义一个像这样的接口:
public interface OfferWithDate{
Offer getOffer();
LocalDateTime getExpirationDate();
String getPictureUrl
}
这样的repository:
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响应(因为它采用了我的接口,无法将任何值Map到它)。我不能添加其他实体的值,也不能将整个实体Map到接口。
1条答案
按热度按时间3pvhb19x1#
我设法找到了解决办法。
缺少的部分是在数据库查询中定义一个自定义名称:
接口必须与给定的名称匹配,但仍然可以看起来像这样:
我希望这对正在寻找这个的人有帮助:)