Java Spring/JPA-查询的最佳方式
我对使用Spring很陌生。我用它来提供Restful服务。 我在问自己,如何在不从相关项获取所有信息的情况下,对关系进行简单的查询 例如: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
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的魔法一样
- 自定义反序列化,同样的问题,很多自定义
- 可能是查询和映射的动态方式(不创建类和类)
编辑:嗯,我似乎不希望有“完美”的答案,但我发现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);
}
}