spring/jpa-查询的最佳方式

rdlzhqv9  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(305)

关闭。这个问题是基于意见的。它目前不接受答案。
**想改进这个问题吗?**更新这个问题,这样就可以通过编辑这篇文章用事实和引文来回答。

两年前关门了。
改进这个问题
我刚开始用Spring。我用它来提供restful服务。我在问自己,如何在不获取相关项的所有信息的情况下,对关系进行简单的查询。
例如:

class Foo {
    @Id
    Long id;

    String name;
    String bar1, bar2, bar3...barN;

    //My approach to avoid get unused data in the json serialization
    @JsonIgnoreProperties({"bar1", "bar2"..., "name", "fooMother", foo"Father"})
    Foo fooFather;

    @JsonIgnoreProperties({"bar1", "bar2"..., "name", "fooMother", foo"Father"})
    Foo fooMother;

//Constructors, getters, setters
}

//Here is where I want to get the data of a Foo instance (just FK in the relationships)
@GetContoller
public Foo getFoo(@RequestParam(value = "id") String id) {
    return fooRespository.findById(id).orElseThrow(() -> new DataNotFoundException());
}

据我所知:
我应该使用lazy fetch来避免在db中自动搜索关系,但是当我的控制器返回foo jackson时,它会看到关系getter,即使是lazy fetch,它也会Map它们。
我的方法很糟糕,事实上我有一个类有10个属性,管理这个东西很糟糕。
我看到的另一个选项是创建一个dao或dto来Map来自jpa的查询结果,但似乎我已经有了一个“foodto”作为请求内容,而且似乎如果我的应用程序将以这种方法发展,我将以fooker1dto、fookery2dto等结束。。
我有创建自定义查询的想法,但是让spring为所有的东西创建自定义查询似乎是不可原谅的,即使在我的实验中,它也会像jackson的魔法一样。
海关反序列化,同样的问题,很多海关。
可能是一种动态的查询和Map方式(不创建类和类)?
所以,我不知道该怎么做。也许我应该选择其中的一种,或者还有其他我没有找到的方法,所以问题是(我很确定没有绝对的答案,spring也不会解决我所有的问题,但我需要意见)如果我想要可伸缩性和性能,我该怎么办?
如果有人在Spring给我推荐一个这样的好方法的好来源,我会非常感激的,因为我在搜索中发现了很多实践和观点不同的材料。
编辑:嗯,似乎我希望没有“完美”的答案,但我发现jsonview有助于管理它。

bvpmtnay

bvpmtnay1#

我建议不要将json配置与实体配置混合使用:在json和jpa实体之间划分职责。
仅使用实体检索数据库信息。创建另一个类,比如 FooJson (或 FooResponse , FooDto 等)并在 FooJsonFoo 实体,并返回此 FooJson 在控制器上。您可以使用一些lib,比如modelmapper,来帮助您实现这一点。
要从数据库中检索信息,可以始终使用 Foo 实体并Map不同foo json类的信息,如: FooCreateJon , FooUpdateJson , FooFindByIdJson ,等等。您可以使用此策略始终返回 Foo 实体if不影响应用程序的性能。
关于代码,您将看到如下内容:

@GetContoller
public FooJson getFoo(@RequestParam(value = "id") String id) {
    return fooService.findById(id).orElseThrow(() -> new DataNotFoundException());
}

这个 FooService :

class FooService {

    FooJson findById(String id) {
        Foo foo = fooRepository.findById(id);
        return new ModelMapper().map(FooJson.class, foo);
    }
}

相关问题