diff --git a/common/src/main/java/org/jiayunet/config/LongListTypeHandler.java b/common/src/main/java/org/jiayunet/config/LongListTypeHandler.java new file mode 100644 index 0000000..c2f9467 --- /dev/null +++ b/common/src/main/java/org/jiayunet/config/LongListTypeHandler.java @@ -0,0 +1,63 @@ +package org.jiayunet.config; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.apache.ibatis.type.BaseTypeHandler; +import org.apache.ibatis.type.JdbcType; +import org.apache.ibatis.type.MappedJdbcTypes; +import org.apache.ibatis.type.MappedTypes; + +import java.sql.CallableStatement; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; + +/** + * List 类型的 JSON TypeHandler + *

解决 JacksonTypeHandler 反序列化 JSON 数组时将小数字解析为 Integer 的问题

+ * + * @author zk + */ +@MappedTypes(List.class) +@MappedJdbcTypes(JdbcType.VARCHAR) +public class LongListTypeHandler extends BaseTypeHandler> { + + private static final ObjectMapper MAPPER = new ObjectMapper(); + private static final TypeReference> TYPE_REF = new TypeReference<>() {}; + + @Override + public void setNonNullParameter(PreparedStatement ps, int i, List parameter, JdbcType jdbcType) throws SQLException { + try { + ps.setString(i, MAPPER.writeValueAsString(parameter)); + } catch (Exception e) { + throw new SQLException("序列化 List 失败", e); + } + } + + @Override + public List getNullableResult(ResultSet rs, String columnName) throws SQLException { + return parse(rs.getString(columnName)); + } + + @Override + public List getNullableResult(ResultSet rs, int columnIndex) throws SQLException { + return parse(rs.getString(columnIndex)); + } + + @Override + public List getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { + return parse(cs.getString(columnIndex)); + } + + private List parse(String json) throws SQLException { + if (json == null || json.isBlank()) { + return null; + } + try { + return MAPPER.readValue(json, TYPE_REF); + } catch (Exception e) { + throw new SQLException("反序列化 List 失败: " + json, e); + } + } +} diff --git a/manager/src/main/java/org/jiayunet/pojo/po/Job.java b/manager/src/main/java/org/jiayunet/pojo/po/Job.java index d8537d4..0a83ef4 100644 --- a/manager/src/main/java/org/jiayunet/pojo/po/Job.java +++ b/manager/src/main/java/org/jiayunet/pojo/po/Job.java @@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; import lombok.Data; +import org.jiayunet.config.LongListTypeHandler; import java.time.Instant; import java.util.List; @@ -64,7 +65,7 @@ public class Job { private Long requiredIndustryId; /** 要求专业ID数组,关联bg_major_category */ - @TableField(typeHandler = JacksonTypeHandler.class) + @TableField(typeHandler = LongListTypeHandler.class) private List requiredMajorIds; /** 专业敏感度 0=不限 1=优先 2=强制 */ diff --git a/manager/src/main/java/org/jiayunet/pojo/po/UserJobIntention.java b/manager/src/main/java/org/jiayunet/pojo/po/UserJobIntention.java index 058a161..5efac7e 100644 --- a/manager/src/main/java/org/jiayunet/pojo/po/UserJobIntention.java +++ b/manager/src/main/java/org/jiayunet/pojo/po/UserJobIntention.java @@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; import lombok.Data; +import org.jiayunet.config.LongListTypeHandler; import java.time.Instant; import java.util.List; @@ -26,7 +27,7 @@ public class UserJobIntention { private Long userId; /** 意向岗位类型ID列表,节点可能为任意级别 */ - @TableField(typeHandler = JacksonTypeHandler.class) + @TableField(typeHandler = LongListTypeHandler.class) private List categoryIds; /** 意向城市编码列表,节点可能为任意级别 */ @@ -34,7 +35,7 @@ public class UserJobIntention { private List regionCodes; /** 意向行业ID列表,节点可能为任意级别 */ - @TableField(typeHandler = JacksonTypeHandler.class) + @TableField(typeHandler = LongListTypeHandler.class) private List industryIds; /** 工作类型 0=全职 1=实习 */ diff --git a/manager/src/main/java/org/jiayunet/pojo/po/UserProfile.java b/manager/src/main/java/org/jiayunet/pojo/po/UserProfile.java index 271049a..f4ce6d4 100644 --- a/manager/src/main/java/org/jiayunet/pojo/po/UserProfile.java +++ b/manager/src/main/java/org/jiayunet/pojo/po/UserProfile.java @@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; import lombok.Data; +import org.jiayunet.config.LongListTypeHandler; import org.jiayunet.pojo.vo.UserHonorsVo; import java.time.Instant; @@ -49,7 +50,7 @@ public class UserProfile { private String portfolioUrl; /** 用户专业ID数组,关联bg_major_category(不展示,用于适配度计算) */ - @TableField(typeHandler = JacksonTypeHandler.class) + @TableField(typeHandler = LongListTypeHandler.class) private List majorIds; /** 学校等级 1=C9/985/QS前50 2=211/双一流/QS前200 3=普通一本/QS前500 4=其他(不展示,用于适配度计算) */ diff --git a/manager/src/main/java/org/jiayunet/pojo/vo/JobListItemVo.java b/manager/src/main/java/org/jiayunet/pojo/vo/JobListItemVo.java index 528071b..643c4df 100644 --- a/manager/src/main/java/org/jiayunet/pojo/vo/JobListItemVo.java +++ b/manager/src/main/java/org/jiayunet/pojo/vo/JobListItemVo.java @@ -3,6 +3,7 @@ package org.jiayunet.pojo.vo; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; import lombok.Data; +import org.jiayunet.config.LongListTypeHandler; import java.util.List; @@ -64,7 +65,7 @@ public class JobListItemVo { private Integer minExperience; /** 要求专业ID数组(JSON) */ - @TableField(typeHandler = JacksonTypeHandler.class) + @TableField(typeHandler = LongListTypeHandler.class) private List requiredMajorIds; /** 专业敏感度 0=不限 1=优先 2=强制 */ diff --git a/manager/src/main/java/org/jiayunet/service/JobMatchService.java b/manager/src/main/java/org/jiayunet/service/JobMatchService.java index a9866c7..e9e9b37 100644 --- a/manager/src/main/java/org/jiayunet/service/JobMatchService.java +++ b/manager/src/main/java/org/jiayunet/service/JobMatchService.java @@ -165,12 +165,13 @@ public class JobMatchService { int score = matchMajorPair(userMajor, jobMajor); maxScore = Math.max(maxScore, score); - if (maxScore == 100) return 100; // 已满分,提前退出 + if (maxScore == 100) return 100; } } return maxScore; } + /** * 匹配一对专业的相关度 *

完全匹配→100,同二级→70,同一级→30,不相关→0

diff --git a/manager/src/main/resources/mapper/JobMapper.xml b/manager/src/main/resources/mapper/JobMapper.xml index b3fecd6..85fb355 100644 --- a/manager/src/main/resources/mapper/JobMapper.xml +++ b/manager/src/main/resources/mapper/JobMapper.xml @@ -10,7 +10,7 @@ - +