我有一个名为Car的数据库。汽车表看起来像这样:
+----+------+--------------+-----------+----------+------+
| Id | Name | Desccription | Make | Model | Year |
+----+------+--------------+-----------+----------+------+
| 1 | A | something1 | Ford | Explorer | 2010 |
| 2 | B | something2 | Nissan | Ultima | 2005 |
| 3 | C | something3 | Chevrolet | Malibu | 2012 |
+----+------+--------------+-----------+----------+------+
我网站上的不同页面想要显示不同的信息。有些页面只想显示名称,有些页面想要显示品牌和型号等。
我有一个api,网络调用以检索所有这些信息。 api使用JPA和QueryDSL与数据库通信并获取信息。我想只获取我想要的特定页面的信息。我正在考虑在我的仓库中实施某种构建模式,以便我只能检索我想要的东西,但我不太清楚如何去做。
例如,我的主页只想显示汽车的名称。因此,它将调用HomeController
,控制器将调用HomeService
,它将调用存储库层,如下所示:
carRepository.getCarById(1).withName().build();
其他一些想要显示品牌和型号的页面会像这样进行回购:
carRepository.getCarById(1).withMake().withModel.build();
在Java / Jpa中实现类似内容的最佳方法是什么?
答案 0 :(得分:1)
如果我正确理解了这个问题,您需要动态构建对实体的不同投影的查询。
在这种情况下,动态实体图表就是您想要的(参见例如:https://www.thoughts-on-java.org/jpa-21-entity-graph-part-2-define/)。您从一个空的实体图开始,每次调用with()
方法之一只需在图表中添加一个字段。
基本查询保持不变,您只需在调用javax.persistence.fetchgraph
时设置提取图提示(build()
)(请注意,上述链接中的示例使用加载图而不是获取图;这里描述了两者之间的细微差别:What is the diffenece between FETCH and LOAD for Entity graph of JPA?)