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

gt0wga4j  于 2023-05-13  发布在  其他
关注(0)|答案(1)|浏览(115)

我正在开发一个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到接口。

3pvhb19x

3pvhb19x1#

我设法找到了解决办法。
缺少的部分是在数据库查询中定义一个自定义名称:

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

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

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

我希望这对正在寻找这个的人有帮助:)

相关问题