Java Spring/JPA-查询的最佳方式

Java Spring/JPA-查询的最佳方式,java,spring,rest,jpa,jackson,Java,Spring,Rest,Jpa,Jackson,我对使用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 @JsonIgnorePropert

我对使用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来避免在数据库中自动搜索关系,但是当我的控制器返回Foo-jackson时,它会看到关系getter,即使是lazy-fetch,它也会映射它们
  • 我的方法很糟糕,实际上我有一个有10个属性的类,并且管理这个东西,这很糟糕
  • 我看到的另一个选项是创建DAO或DTO来映射来自JPA的查询结果,但似乎我已经有了一个“FooDTO”作为请求内容,而且似乎如果我的应用程序将以这种方法发展,我将以Fookery1DTO、Fookery2DTO等结束
  • 我有创建自定义查询的想法,但让Spring为所有内容创建自定义查询似乎是不可原谅的,即使在我的实验中,它也会像Jackson的魔法一样
  • 自定义反序列化,同样的问题,很多自定义
  • 可能是查询和映射的动态方式(不创建类和类)
所以,我不知道该怎么做。也许我应该选择其中一种,或者还有其他我没有找到的方法,所以问题是(我很确定没有绝对的答案,Spring不会解决我所有的问题,但我需要意见),如果我想要可伸缩性和性能,我该怎么办

如果有人在春季向我推荐这种良好实践的好来源,我将不胜感激,因为我在搜索中发现了大量实践和观点各异的材料


编辑:嗯,我似乎不希望有“完美”的答案,但我发现JsonView有助于管理它。

我建议不要将Json配置与实体配置混为一谈。:在Json和JPA实体之间划分责任

仅使用实体检索数据库信息。创建另一个类,如
FooJson
(或
FooResponse
FooDto
,等等),并从
Foo
实体中填充所需的
FooJson
信息,然后在控制器上返回此
FooJson
。你可以使用一些库,比如,来帮助你

要从数据库中检索信息,您可以始终使用
Foo
实体并将其信息映射到不同的Foo Json类,如:
FooCreateJon
foodupdatejson
FooFindByIdJson
,等等。如果不影响应用程序的性能,则可以使用此策略始终返回
Foo
实体

关于代码,您将有如下内容:

@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);
    }
}