我对 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());
}
据我所知:
- 我应该使用延迟获取来避免在数据库中自动进行关系搜索,但是当我的 Controller 返回 Foo jackson 时,它将看到关系 getter ,即使它是延迟获取,它也会映射它们。
- 我的方法很糟糕,实际上我有一个具有 10 个属性的类并管理该东西,这很糟糕。
- 我看到的其他选项是创建 DAO 或 DTO 来映射 JPA 的查询结果,但似乎我已经有一个“FooDTO”作为请求内容,而且似乎如果我的应用程序将通过这种方法发展,我会以 FooQuery1Dto、FooQuery2Dto 等结尾。
- 我有创建自定义查询的想法,但让 Spring 对所有内容进行自定义查询似乎是不可原谅的,即使如此,就我的实验而言,它也能发挥 Jackson 的魔力。
- 自定义反序列化,同样的问题,自定义了很多。
- 也许是一种动态的查询和映射方式(无需创建类和类)?
所以,我不知道该如何行动。也许我应该选择其中之一,或者还有其他我没有找到的方法,所以问题是(我很确定不会有绝对的答案,Spring不会解决我所有的问题,但我需要意见)什么如果我想要可扩展性和性能,我应该怎么做?
如果有人向我推荐 Spring 中此类良好实践的良好来源,我将非常感激,因为在搜索中我发现了很多具有不同实践和观点的 Material 。
编辑:嗯,似乎我希望没有“完美”的答案,但我发现 JsonView 可以帮助管理它。
最佳答案
我建议不要将 Json 配置与实体配置混合:在 Json 和 JPA 实体之间划分职责。
仅使用您的实体来检索数据库信息。创建另一个类,例如 FooJson
(或 FooResponse
、FooDto
等),并在 FooJson< 上填写所需的信息
来自 Foo
实体,并在 Controller 上返回此 FooJson
。您可以使用一些库,例如 ModelMapper ,在这方面为您提供帮助。
要从数据库中检索信息,您始终可以使用 Foo
实体并将其信息映射到不同的 Foo Json 类,例如:FooCreateJon
、FooUpdateJson
、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);
}
}
关于java - Spring/JPA - 最佳查询方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53660138/