在我们这个高度并发的现代世界中,企业应用程序开发人员必须应对新的挑战,如庞大的数据量、客户的多样性以及不断变化的业务需求。现在,当微服务应用程序必须为各种客户端提供服务时,这是通常的情况,其中一些是其他微服务。这些因素意味着对控制数据流量的要求更高。我们负担不起发送任何过多的数据,我们需要响应每个请求,并为此特定客户精心定制数据。

自定义数据流量的一个选项是使用投影查询;也就是说,返回域对象的投影的查询。几乎所有的企业应用程序都使用某种 ORM 技术,JPA 是实现该技术的标准方法。因此,让我们看看如何基于 JPA 2.2 规范实现投影查询。

假设我们要实现一个集合管理在线应用程序。域系统如下。

清单1:集合项目.java

Java

x

48
1
导入javax持久性元素集合;
2
导入javax持久性实体;
3
导入javax持久性生成值;
4
导入javax持久性生成类型;
5
导入javax持久性ID;
6
导入javax持久性加入哥伦布;
7
导入javax

洛布;

8
导入javax持久性一个一;
9
导入javax持久性序列生成器;
10
导入javax持久性;
11

12
@Entity
13
@Table名称="COLLECTION_ITEMS")
14
公共集合项 |
15

16
   @Id
17
   @SequenceGenerator名称="CollectionItems_Generator"序列名称="CollectionItems_seq"分配大小=1
18
    @GeneratedValue(策略=生成类型

PERSISTcascadeType.MERGE =,孤儿移动=true

24
   @JoinColumn名称="small_image"唯一=true
25
   图像小图像;
26

27
   @OneToOne级联==级联类型持久级联类型合并孤儿移动 =真实
28
   @JoinColumn名称="图像" 唯=true
29
   图像;
30

31
   字符串名称;
32

33
   字符串摘要;
34

35
   @Lob
36
   字符串描述;
37

38
   ;
39

40
   字符串国家/
41

42
   @ElementCollection
43
   @CollectionTable(名称="ITEMS_TOPICS"加入哥伦布=@JoinColumn名称="ITEM_ID"))
44
   @Column名称="主题")
45
   设置<字符串>主题;
46

47
获取器设置器
48

.

清单2:图像.java

Java

x
1
24
1
导入javax

实体;

2
导入javax持久性生成值;
3
导入javax持久性生成类型;
4
导入javax持久性ID;
5
导入javax持久性洛布;
6
导入javax持久性序列生成器;
7
导入javax持久性;
8

9
@Entity
10
@Table名称="图像")
11
公共映像实现java

可序列化 |

12

13
   专用静态最终串行UID=1L;
14

15
   @Id
16
   @SequenceGenerator名称="Images_Generator"序列名称="Images_seq"分配大小=1
17
    @GeneratedValue(策略=生成类型)。序列生成器="Images_Generator")
18
   私人ID;
19

20
   @Lob
21
   私有字符串内容;
22

23
获取器设置器
24

.

注: 在 Web 应用程序中,将图像存储在文件系统中并存储在数据库中的路径通常效率更高。

根据规范,我们需要在表中显示集合项(可能按某些搜索条件进行筛选),其属性包括:id、名称摘要年、价格、国家/地区、小型图像。此外,我们需要显示每个选定项目的以下数据:名称,描述,年,国家价格,图像。为了满足这些要求,我们可以实现数据传输对象 (DTO)。

清单 3: 集合项目.java

Java

x
1
36