From 6014e84dcf4e010deaa5104ce4c40f6d69e4d4e8 Mon Sep 17 00:00:00 2001 From: uname <2986773479@qq.com> Date: Mon, 9 Feb 2026 16:28:31 +0800 Subject: [PATCH] fix: fix the writing and query logic of dataset labels --- .../DatasetApplicationService.java | 13 ++------ .../domain/model/dataset/Dataset.java | 4 ++- .../impl/DatasetRepositoryImpl.java | 10 +++--- .../converter/DatasetConverter.java | 32 ------------------- .../config/PgJsonTypeHandler.java | 5 +++ scripts/db/data-management-init.sql | 2 +- 6 files changed, 17 insertions(+), 49 deletions(-) diff --git a/backend/services/data-management-service/src/main/java/com/datamate/datamanagement/application/DatasetApplicationService.java b/backend/services/data-management-service/src/main/java/com/datamate/datamanagement/application/DatasetApplicationService.java index f9e3a55c..8ad733fa 100644 --- a/backend/services/data-management-service/src/main/java/com/datamate/datamanagement/application/DatasetApplicationService.java +++ b/backend/services/data-management-service/src/main/java/com/datamate/datamanagement/application/DatasetApplicationService.java @@ -194,7 +194,7 @@ public PagedResponse getDatasets(DatasetPagingQuery query) { /** * 处理标签名称,创建或获取标签 */ - private String processTagNames(List tagNames) { + private List processTagNames(List tagNames) { Set tags = new HashSet<>(); for (String tagName : tagNames) { Tag tag = tagMapper.findByName(tagName); @@ -209,16 +209,7 @@ private String processTagNames(List tagNames) { tagMapper.updateUsageCount(tag.getId(), tag.getUsageCount()); tags.add(tag); } - ObjectMapper mapper = new ObjectMapper(); - try { - mapper.registerModule(new JavaTimeModule()); - // 可选:配置日期时间格式 - mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); - return mapper.writeValueAsString(tags); - } catch (JsonProcessingException e) { - log.warn("Parse tags to json error."); - return null; - } + return tags.stream().toList(); } /** diff --git a/backend/services/data-management-service/src/main/java/com/datamate/datamanagement/domain/model/dataset/Dataset.java b/backend/services/data-management-service/src/main/java/com/datamate/datamanagement/domain/model/dataset/Dataset.java index ea3aa18c..6ded0ebf 100644 --- a/backend/services/data-management-service/src/main/java/com/datamate/datamanagement/domain/model/dataset/Dataset.java +++ b/backend/services/data-management-service/src/main/java/com/datamate/datamanagement/domain/model/dataset/Dataset.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import com.datamate.common.domain.model.base.BaseEntity; +import com.datamate.common.infrastructure.config.PgJsonTypeHandler; import com.datamate.datamanagement.common.enums.DatasetStatusType; import com.datamate.datamanagement.common.enums.DatasetType; import lombok.Getter; @@ -66,7 +67,8 @@ public class Dataset extends BaseEntity { /** * 标签列表, JSON格式 */ - private String tags; + @TableField(typeHandler = PgJsonTypeHandler.class) + private List tags; /** * 额外元数据,JSON格式 */ diff --git a/backend/services/data-management-service/src/main/java/com/datamate/datamanagement/infrastructure/persistence/repository/impl/DatasetRepositoryImpl.java b/backend/services/data-management-service/src/main/java/com/datamate/datamanagement/infrastructure/persistence/repository/impl/DatasetRepositoryImpl.java index 2366da92..8bb6b017 100644 --- a/backend/services/data-management-service/src/main/java/com/datamate/datamanagement/infrastructure/persistence/repository/impl/DatasetRepositoryImpl.java +++ b/backend/services/data-management-service/src/main/java/com/datamate/datamanagement/infrastructure/persistence/repository/impl/DatasetRepositoryImpl.java @@ -65,10 +65,12 @@ public IPage findByCriteria(IPage page, DatasetPagingQuery que */ for (String tagName : query.getTags()) { wrapper.and(w -> - w.apply("tags IS NOT NULL " + - "AND JSON_VALID(tags) = 1 " + - "AND JSON_LENGTH(tags) > 0 " + - "AND JSON_SEARCH(tags, 'one', {0}, NULL, '$[*].name') IS NOT NULL", tagName) + w.apply("EXISTS ( " + + "SELECT 1 FROM jsonb_array_elements( " + + "CASE WHEN jsonb_typeof(tags::jsonb) = 'array' THEN tags::jsonb ELSE '[]'::jsonb END " + + ") AS tag " + + "WHERE tag->>'name' = {0} " + + ")", tagName) ); } wrapper.orderByDesc(Dataset::getCreatedAt); diff --git a/backend/services/data-management-service/src/main/java/com/datamate/datamanagement/interfaces/converter/DatasetConverter.java b/backend/services/data-management-service/src/main/java/com/datamate/datamanagement/interfaces/converter/DatasetConverter.java index ab0fc73c..e3cde1c6 100644 --- a/backend/services/data-management-service/src/main/java/com/datamate/datamanagement/interfaces/converter/DatasetConverter.java +++ b/backend/services/data-management-service/src/main/java/com/datamate/datamanagement/interfaces/converter/DatasetConverter.java @@ -4,15 +4,8 @@ import com.datamate.datamanagement.domain.model.dataset.Dataset; import com.datamate.datamanagement.domain.model.dataset.DatasetFile; import com.datamate.datamanagement.domain.model.dataset.FileTag; -import com.datamate.datamanagement.domain.model.dataset.Tag; import com.datamate.datamanagement.interfaces.dto.*; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.lang3.StringUtils; import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.Named; @@ -34,7 +27,6 @@ public interface DatasetConverter { @Mapping(source = "sizeBytes", target = "totalSize") @Mapping(source = "path", target = "targetLocation") @Mapping(source = "files", target = "distribution", qualifiedByName = "getDistribution") - @Mapping(source = "tags", target = "tags", qualifiedByName = "getDatasetTags") DatasetResponse convertToResponse(Dataset dataset); /** @@ -91,28 +83,4 @@ default Map> getDistribution(List dataset } return distribution; } - - /** - * 获取数据集标签 - * - * @param datasetTag 数据集标签 - * @return 标签 - */ - @Named("getDatasetTags") - default List getDatasetTags(String datasetTag) { - List tagResponses = new ArrayList<>(); - if (StringUtils.isBlank(datasetTag)) { - return tagResponses; - } - ObjectMapper mapper = new ObjectMapper(); - try { - mapper.registerModule(new JavaTimeModule()); - // 可选:配置日期时间格式 - mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); - return mapper.readValue(datasetTag, new TypeReference>() { - }).stream().map(TagConverter.INSTANCE::convertToResponse).toList(); - } catch (Exception e) { - return Collections.emptyList(); - } - } } diff --git a/backend/shared/domain-common/src/main/java/com/datamate/common/infrastructure/config/PgJsonTypeHandler.java b/backend/shared/domain-common/src/main/java/com/datamate/common/infrastructure/config/PgJsonTypeHandler.java index 3b2d5163..9a25486a 100644 --- a/backend/shared/domain-common/src/main/java/com/datamate/common/infrastructure/config/PgJsonTypeHandler.java +++ b/backend/shared/domain-common/src/main/java/com/datamate/common/infrastructure/config/PgJsonTypeHandler.java @@ -6,6 +6,7 @@ import org.apache.ibatis.type.MappedTypes; import org.postgresql.util.PGobject; +import java.lang.reflect.Field; import java.sql.PreparedStatement; import java.sql.SQLException; @@ -18,6 +19,10 @@ public PgJsonTypeHandler(Class type) { super(type); } + public PgJsonTypeHandler(Class type, Field field) { + super(type, field); + } + @Override public void setNonNullParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException { // 1. 先借助父类转成 JSON 字符串 diff --git a/scripts/db/data-management-init.sql b/scripts/db/data-management-init.sql index 5551faa3..266b3453 100644 --- a/scripts/db/data-management-init.sql +++ b/scripts/db/data-management-init.sql @@ -14,7 +14,7 @@ CREATE TABLE IF NOT EXISTS t_dm_datasets ( file_count BIGINT DEFAULT 0, record_count BIGINT DEFAULT 0, retention_days INTEGER DEFAULT 0, - tags TEXT, + tags JSONB, metadata JSONB, status VARCHAR(50) DEFAULT 'DRAFT', is_public BOOLEAN DEFAULT FALSE,