我有一个数据库,其中包含一个名为Car的表。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,web调用它来检索所有这些信息。api使用JPA和QueryDSL与数据库通信并获取信息。我只想获取我想要的那个特定页面的信息。我在考虑对我的回购实现某种构建模式,以便我只检索我想要的东西,但我不太确定如何去做。
例如,我的主页只想显示汽车的名称。所以它会调用HomeController
,控制器会调用HomeService
,它会调用存储库层,如下所示:
carRepository.getCarById(1).withName().build();
其他一些想要显示品牌和型号的页面会像这样进行repo调用:
carRepository.getCarById(1).withMake().withModel.build();
在Java /Jpa中实现这样的东西的最佳方法是什么?
如果我对这个问题理解正确的话,您希望为您的实体的不同投影动态构建查询。
在这种情况下,动态实体图就是您想要的(例如,参见:https://www . thoughts-on-Java . org/JPA-21-entity-graph-part-2-define/)。您从一个空的实体图开始,每次调用您的< code>with()方法都只是向图中添加一个字段。
基本查询保持不变,您只需要在调用build()
时设置获取图提示(javax.persistence.fetchgraph
)(请注意,上面链接中的示例使用加载图而不是提取图;两者之间的细微区别如下所述:对于JPA的实体图,FETCH和LOAD之间的差异是什么?)