From f91baac5cae25ff3e474f61ddb5dd3ae2a90f649 Mon Sep 17 00:00:00 2001
From: Suomm <1474983351@qq.com>
Date: Tue, 8 Aug 2023 16:27:55 +0800
Subject: [PATCH] =?UTF-8?q?feat:=20=E5=B1=9E=E6=80=A7=E6=9F=A5=E8=AF=A2?=
=?UTF-8?q?=E6=9E=84=E5=BB=BA=E3=80=82?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../mybatisflex/core/query/FieldsBuilder.java | 141 ++++++++++++++++++
1 file changed, 141 insertions(+)
create mode 100644 mybatis-flex-core/src/main/java/com/mybatisflex/core/query/FieldsBuilder.java
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;
+ }
+
+}