【问题标题】:Java Database Access Builder PatterJava 数据库访问构建器模式
【发布时间】:2017-06-23 23:43:44
【问题描述】:

我有一个数据库,其中有一个名为 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 中实现此类功能的最佳方法是什么?

【问题讨论】:

  • 我建议您从一些基本的 JPA 教程开始,然后随着您对 JPA 的进一步了解,将其构建到您的汽车 API 中。正如它所写的那样,这个问题对于 SO 来说太宽泛了。
  • @AndyGuibert 我们实际上已经有一个 jpa 播放器来获取数据,但问题是我们总是为所有页面检索太多。当我们有一个 getById 方法时,它会检索整个汽车实体,这对于某些页面来说信息太多。因此,我们开始为特定页面编写方法,例如 getCarByIdForHomePage 或 getCarByIdForAdminPage 等。但这很快就会失控,所以我想知道是否有更好的方法

标签: java database jpa architecture


【解决方案1】:

如果我正确理解了这个问题,您希望动态构建对实体的不同投影的查询。

在这种情况下,动态实体图就是您想要的(参见例如这里:https://www.thoughts-on-java.org/jpa-21-entity-graph-part-2-define/)。您从一个空实体图开始,每次调用您的 with() 方法之一只是将一个字段添加到图中。

基本查询保持不变,您只需要在调用build() 时设置获取图提示(javax.persistence.fetchgraph)(请注意,以上链接中的示例使用加载图而不是获取图;两者之间的细微差别这里描述了两个:What is the diffenece between FETCH and LOAD for Entity graph of JPA?)

【讨论】:

  • 完美!这就是我要找的!!
猜你喜欢
  • 1970-01-01
  • 2016-06-22
  • 2012-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多