Java数据库访问生成器模式

时间:2017-06-23 23:43:44

标签: java database jpa architecture

我有一个名为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中实现类似内容的最佳方法是什么?

1 个答案:

答案 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?