diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/FieldsBuilder.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/FieldsBuilder.java
new file mode 100644
index 00000000..1eb980da
--- /dev/null
+++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/FieldsBuilder.java
@@ -0,0 +1,141 @@
+/*
+ * Copyright (c) 2022-2023, Mybatis-Flex (fuhai999@gmail.com).
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.mybatisflex.core.query;
+
+import com.mybatisflex.core.field.FieldQuery;
+import com.mybatisflex.core.field.FieldQueryManager;
+import com.mybatisflex.core.field.QueryBuilder;
+import com.mybatisflex.core.paginate.Page;
+import com.mybatisflex.core.util.FieldWrapper;
+import com.mybatisflex.core.util.LambdaGetter;
+import com.mybatisflex.core.util.LambdaUtil;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 使用 {@code Fields Query} 的方式进行关联查询。
+ *
+ * @author 王帅
+ * @since 2023-08-08
+ */
+public class FieldsBuilder extends AbstractQueryBuilder {
+
+ protected final Map fieldQueryMap;
+
+ public FieldsBuilder(MapperQueryChain delegate) {
+ super(delegate);
+ this.fieldQueryMap = new HashMap<>();
+ }
+
+ /**
+ * 设置属性对应的 {@code QueryWrapper} 查询。
+ *
+ * @param field 属性
+ * @param builder {@code QueryWrapper} 构建
+ * @param 属性类型
+ * @return 属性查询构建
+ */
+ public FieldsBuilder fieldMapping(LambdaGetter field, QueryBuilder builder) {
+ return fieldMapping(field, false, builder);
+ }
+
+ /**
+ * 设置属性对应的 {@code QueryWrapper} 查询。
+ *
+ * @param field 属性
+ * @param prevent 阻止对嵌套类属性的查询
+ * @param builder {@code QueryWrapper} 构建
+ * @param 属性类型
+ * @return 属性查询构建
+ */
+ public FieldsBuilder fieldMapping(LambdaGetter field, boolean prevent, QueryBuilder builder) {
+ String fieldName = LambdaUtil.getFieldName(field);
+ Class> entityClass = LambdaUtil.getImplClass(field);
+ FieldQuery fieldQuery = new FieldQuery();
+ fieldQuery.setPrevent(prevent);
+ fieldQuery.setFieldName(fieldName);
+ fieldQuery.setQueryBuilder(builder);
+ fieldQuery.setEntityClass(entityClass);
+ fieldQuery.setFieldWrapper(FieldWrapper.of(entityClass, fieldName));
+ this.fieldQueryMap.put(entityClass.getName() + '#' + fieldName, fieldQuery);
+ return this;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public T one() {
+ List entities = Collections.singletonList(baseMapper().selectOneByQuery(queryWrapper()));
+ FieldQueryManager.queryFields(baseMapper(), entities, fieldQueryMap);
+ return entities.get(0);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public R oneAs(Class asType) {
+ List entities = Collections.singletonList(baseMapper().selectOneByQueryAs(queryWrapper(), asType));
+ FieldQueryManager.queryFields(baseMapper(), entities, fieldQueryMap);
+ return entities.get(0);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public List list() {
+ List entities = baseMapper().selectListByQuery(queryWrapper());
+ FieldQueryManager.queryFields(baseMapper(), entities, fieldQueryMap);
+ return entities;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public List listAs(Class asType) {
+ List entities = baseMapper().selectListByQueryAs(queryWrapper(), asType);
+ FieldQueryManager.queryFields(baseMapper(), entities, fieldQueryMap);
+ return entities;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public Page page(Page page) {
+ baseMapper().paginate(page, queryWrapper());
+ FieldQueryManager.queryFields(baseMapper(), page.getRecords(), fieldQueryMap);
+ return page;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public Page pageAs(Page page, Class asType) {
+ baseMapper().paginateAs(page, queryWrapper(), asType);
+ FieldQueryManager.queryFields(baseMapper(), page.getRecords(), fieldQueryMap);
+ return page;
+ }
+
+}