解決Mybatis-plus自定義TypeHandler查詢映射結(jié)果一直為null問題
踩坑背景
需求
將實體類中的JSONObject對象與MySQL數(shù)據(jù)庫中VARCHAR類型進行映射
//實體類 @TableName(autoResultMap = true) @Data public class ImportItem implements Serializable { ... @ExcelIgnore @TableField(typeHandler = Fastjson2TypeHandler.class , value = "dynamic_information") private JSONObject dynamicInformation; ... }
//自定義類Fastjson2TypeHandler @MappedTypes({JSONObject.class}) @MappedJdbcTypes({JdbcType.VARCHAR}) public class Fastjson2TypeHandler extends AbstractJsonTypeHandler<JSONObject> { private static final Logger log = LoggerFactory.getLogger(Fastjson2TypeHandler.class); private final Class<JSONObject> type = JSONObject.class; public Fastjson2TypeHandler() { log.trace("Fastjson2TypeHandler({})", type); } @Override protected JSONObject parse(String json) { return JSON.parseObject(json, this.type); } @Override protected String toJson(JSONObject obj) { return obj != null ? obj.toJSONString() : null; } }
//自定義查詢語句 public interface ImportItemMapper extends MyMapper<ImportItem> { @Select("<script>" + "SELECT * from import_item \n" + "WHERE company_id=#{companyId} \n" + "<if test='batchNumber!= null and batchNumber!=\"\" '>AND batch_number=#{batchNumber}</if> \n" + "<if test='mark!= null'>AND mark=#{mark}</if> \n" + "${params.dataScope}" + "</script>") List<ImportItem> getByBatchNumber(ItemQuery itemQuery); }
此時在操作的時候增刪改都沒為問題,但是調(diào)用自定義的查詢接口的時候dynamicInformation始終查詢結(jié)果為空,通過開啟Mybatis-plus日志打印發(fā)現(xiàn)sql查詢結(jié)果是正常的,因此判斷是自定義的Fastjson2TypeHandler沒有生效。
問題排查
1、實體類注解
@TableName(autoResultMap = true)
2、需要映射處理的字段需要添加注解
@TableField(typeHandler = Fastjson2TypeHandler.class , value = "dynamic_information") private JSONObject dynamicInformation;
3、各種路徑問題,字段拼寫排查確保正確
4、可以嘗試xml中resultMap使用 typeHandler 屬性
此時問題依舊存在,于是懷疑ImportItemMapper接口問題,由于之前一直沒有使用xml文件,于是決定嘗試使用xml
public interface ImportItemMapper extends MyMapper<ImportItem> { List<ImportItem> getByBatchNumber(ItemQuery itemQuery); }
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.ruoyi.plm.mapper.ImportItemMapper"> <resultMap id="BaseResultMap" type="com.ruoyi.plm.model.entity.ImportItem"> <id column="dynamic_information" jdbcType="VARCHAR" property="dynamicInformation" typeHandler="com.ruoyi.plm.util.Fastjson2TypeHandler"/> </resultMap> <select id="getByBatchNumber" resultMap="BaseResultMap" parameterType="com.ruoyi.system.api.model.plm.ItemQuery"> SELECT * FROM import_item WHERE company_id = #{companyId} <if test="batchNumber != null and !batchNumber.isEmpty()"> AND batch_number = #{batchNumber} </if> <if test="mark != null"> AND mark = #{mark} </if> ${params.dataScope} </select> </mapper>
此時再次嘗試后發(fā)現(xiàn)問題已經(jīng)解決,既然這種方式可以解決問題,那么很有可能是因為自定義 TypeHandler 沒能正確注冊到 MyBatis,因此可以嘗試放棄使用xml選則最后一種方式
5、 注冊自定義TypeHandler到 MyBatis
@Configuration public class MyBatisConfig { @Bean public ConfigurationCustomizer mybatisConfigurationCustomizer() { return configuration -> { // 注冊自定義 TypeHandler configuration.getTypeHandlerRegistry().register(JSONObject.class, JdbcType.VARCHAR, new Fastjson2TypeHandler()); }; } }
經(jīng)測試注冊后結(jié)合注解自定義sql語句查詢一切正常,問題完美解決。
總結(jié)
出現(xiàn)增刪改數(shù)據(jù)正常,但查詢結(jié)果為null,很有可能是自定義的TypeHandler未生效,可以參考上述4或5的方法來解決問題。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Java多線程連續(xù)打印abc實現(xiàn)方法詳解
這篇文章主要介紹了Java多線程連續(xù)打印abc實現(xiàn)方法詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-03-03java解析dbf之通過javadbf包生成和讀取dbf文件
這篇文章主要介紹了java通過javadbf讀取和生成DBF文件的方法,大家參考使用吧2014-01-01深入理解Java基礎之try-with-resource語法糖
這篇文章主要介紹了深入理解Java基礎之try-with-resource語法糖,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-02-02深度剖析Java成員變量、局部變量和靜態(tài)變量的創(chuàng)建和回收時機
這篇文章主要介紹了深度剖析Java成員變量、局部變量和靜態(tài)變量的創(chuàng)建和回收時機,成員變量是定義在類中的變量,每個類的實例都會擁有自己的成員變量。它們的生命周期與對象的創(chuàng)建和銷毀相對應,下面我將詳細介紹它們的特點和生命周期,需要的朋友可以參考下2023-07-07