# 对象分层

常用的对象的有以下几个层次：

* 数据对象（实体）：跟数据库中的表结构对应，实体关系反映外键关联。
* 数据传输对象（DTO）：跟界面数据新增、修改表单对应，满足数据的传输、展示需求。针对同一个实体的数据提交和数据查询可能会对应不同的DTO。
* 数据展示对象（VO）：根据页面展示需求，可能对DTO进行进一步的转换。
* 数据查询对象（QO）：跟界面的查询表单对应，负责传递参数到后端服务。

## 数据对象（实体）

数据对象的作用是数据库实现一一映射的关系。

根据数据库设计可以定义出实体和实体关系，进而通过JPA生成数据库表结构（或者通过已有的表结构反向生成实体）。

## 数据传输对象（DTO）

数据传输对象一般来讲分为两种：提交数据时的传输对象和获取数据时的传输对象。前者和前端页面中的数据新增/修改表单对应，后者和前端的数据表格对应。通常情况下可以使用统一的数据传输对象同时满足以上两种需求。

DTO的数据通常有缓存的需求，因此不推荐在DTO中使用实体关联。DTO和实体之间存在大量相互转换的需求，当实体和DTO中字段不一致时，需要在DTO中配置映射关系。

DTO通常存在于接口交互中，使用Swagger定义DTO的属性和示例值。

## 数据展示对象（VO）

一般情况下，DTO可以满足页面展示的需求，当DTO无法满足页面展示需求时，可能会对DTO做进一步的转换，以VO的形式返回给调用者。

在RESTful Webservice中，一般不推荐使用VO。

## 数据查询对象（QO）

在信息管理系统中，存在大量的表单查询需求，QO是和查询表单对应的对象。

对于复杂的比较条件（如：大于、包含于、模糊匹配等）查询，开发人员只需在QO中使用`@QueryCondition`注解维护查询条件，前端以普通参数的形式将表单提交到后端，MVC框架负责将参数映射到QO中。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://taocares.gitbook.io/development-guide/kai-fa-zhi-nan/ji-ben-pei-zhi.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
