fix: 使用 join 联表查询一个对象,数据丢失。

This commit is contained in:
Suomm 2023-06-08 12:32:55 +08:00
parent 4e5d9913bb
commit d56b886db0
2 changed files with 39 additions and 22 deletions

View File

@ -1,17 +1,17 @@
/** /*
* Copyright (c) 2022-2023, Mybatis-Flex (fuhai999@gmail.com). * Copyright (c) 2022-2023, Mybatis-Flex (fuhai999@gmail.com).
* <p> * <p>
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
* <p> * <p>
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* <p> * <p>
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package com.mybatisflex.core; package com.mybatisflex.core;
@ -345,8 +345,7 @@ public interface BaseMapper<T> {
* @return entity 数据 * @return entity 数据
*/ */
default T selectOneByQuery(QueryWrapper queryWrapper) { default T selectOneByQuery(QueryWrapper queryWrapper) {
List<T> entities = selectListByQuery(queryWrapper.limit(1)); return SqlUtil.getSelectOneResult(selectListByQuery(queryWrapper));
return (entities == null || entities.isEmpty()) ? null : entities.get(0);
} }
@ -358,8 +357,7 @@ public interface BaseMapper<T> {
* @return 数据内容 * @return 数据内容
*/ */
default <R> R selectOneByQueryAs(QueryWrapper queryWrapper, Class<R> asType) { default <R> R selectOneByQueryAs(QueryWrapper queryWrapper, Class<R> asType) {
List<R> entities = selectListByQueryAs(queryWrapper.limit(1), asType); return SqlUtil.getSelectOneResult(selectListByQueryAs(queryWrapper, asType));
return (entities == null || entities.isEmpty()) ? null : entities.get(0);
} }
/** /**
@ -495,8 +493,7 @@ public interface BaseMapper<T> {
* @return 数据量 * @return 数据量
*/ */
default Object selectObjectByQuery(QueryWrapper queryWrapper) { default Object selectObjectByQuery(QueryWrapper queryWrapper) {
List<Object> objects = selectObjectListByQuery(queryWrapper.limit(1)); return SqlUtil.getSelectOneResult(selectObjectListByQuery(queryWrapper));
return objects == null || objects.isEmpty() ? null : objects.get(0);
} }

View File

@ -15,13 +15,18 @@
*/ */
package com.mybatisflex.core.util; package com.mybatisflex.core.util;
import org.apache.ibatis.exceptions.TooManyResultsException;
import org.apache.ibatis.session.defaults.DefaultSqlSession;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.Date; import java.util.Date;
import java.util.List;
import java.util.regex.Matcher; import java.util.regex.Matcher;
public class SqlUtil { public class SqlUtil {
private SqlUtil() {} private SqlUtil() {
}
public static void keepColumnSafely(String column) { public static void keepColumnSafely(String column) {
if (StringUtil.isBlank(column)) { if (StringUtil.isBlank(column)) {
@ -78,7 +83,7 @@ public class SqlUtil {
} }
public static String replaceSqlParams(String sql, Object[] params){ public static String replaceSqlParams(String sql, Object[] params) {
if (params != null && params.length > 0) { if (params != null && params.length > 0) {
for (Object value : params) { for (Object value : params) {
// null // null
@ -108,4 +113,19 @@ public class SqlUtil {
return sql; return sql;
} }
/**
* 搬运加改造 {@link DefaultSqlSession#selectOne(String, Object)}
*/
public static <T> T getSelectOneResult(List<T> list) {
if (list == null || list.isEmpty()) {
return null;
}
int size = list.size();
if (size == 1) {
return list.get(0);
}
throw new TooManyResultsException(
"Expected one result (or null) to be returned by selectOne(), but found: " + size);
}
} }