提问者:小点点

如何定义从多个实体和值构建的自定义返回类型


我正在开发一个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响应(因为它需要我的接口,不能将任何值映射到它)。我不能从其他实体添加值,也不能将整个实体映射到接口。


共1个答案

匿名用户

我设法找到了解决办法。

缺少的部分是在数据库查询中定义一个自定义名称:

...SELECT o as offer, b.expirationDate as exDate, p.pictureUrl as picUrls FROM...

接口必须与给定的名称匹配,但仍然可以看起来像这样:

    public interface OfferWithDate{
         Offer getOffer();
         LocalDateTime getExDate();
         String getPicUrl();
}

我希望这有助于任何人正在寻找这个:)