解決Mybatis-plus自定義TypeHandler查詢映射結(jié)果一直為null問題
踩坑背景
需求
將實(shí)體類中的JSONObject對(duì)象與MySQL數(shù)據(jù)庫中VARCHAR類型進(jìn)行映射
//實(shí)體類 @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); }
此時(shí)在操作的時(shí)候增刪改都沒為問題,但是調(diào)用自定義的查詢接口的時(shí)候dynamicInformation始終查詢結(jié)果為空,通過開啟Mybatis-plus日志打印發(fā)現(xiàn)sql查詢結(jié)果是正常的,因此判斷是自定義的Fastjson2TypeHandler沒有生效。
問題排查
1、實(shí)體類注解
@TableName(autoResultMap = true)
2、需要映射處理的字段需要添加注解
@TableField(typeHandler = Fastjson2TypeHandler.class , value = "dynamic_information") private JSONObject dynamicInformation;
3、各種路徑問題,字段拼寫排查確保正確
4、可以嘗試xml中resultMap使用 typeHandler 屬性
此時(shí)問題依舊存在,于是懷疑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>
此時(shí)再次嘗試后發(fā)現(xiàn)問題已經(jīng)解決,既然這種方式可以解決問題,那么很有可能是因?yàn)樽远x TypeHandler 沒能正確注冊(cè)到 MyBatis,因此可以嘗試放棄使用xml選則最后一種方式
5、 注冊(cè)自定義TypeHandler到 MyBatis
@Configuration public class MyBatisConfig { @Bean public ConfigurationCustomizer mybatisConfigurationCustomizer() { return configuration -> { // 注冊(cè)自定義 TypeHandler configuration.getTypeHandlerRegistry().register(JSONObject.class, JdbcType.VARCHAR, new Fastjson2TypeHandler()); }; } }
經(jīng)測試注冊(cè)后結(jié)合注解自定義sql語句查詢一切正常,問題完美解決。
總結(jié)
出現(xiàn)增刪改數(shù)據(jù)正常,但查詢結(jié)果為null,很有可能是自定義的TypeHandler未生效,可以參考上述4或5的方法來解決問題。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java多線程連續(xù)打印abc實(shí)現(xiàn)方法詳解
這篇文章主要介紹了Java多線程連續(xù)打印abc實(shí)現(xiàn)方法詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03實(shí)例講解Java并發(fā)編程之ThreadLocal類
這篇文章主要介紹了實(shí)例講解Java并發(fā)編程之ThreadLocal類,本文給出了模擬ThreadLocal、實(shí)用ThreadLocal等代碼實(shí)例,需要的朋友可以參考下2015-04-04java解析dbf之通過javadbf包生成和讀取dbf文件
這篇文章主要介紹了java通過javadbf讀取和生成DBF文件的方法,大家參考使用吧2014-01-01深入理解Java基礎(chǔ)之try-with-resource語法糖
這篇文章主要介紹了深入理解Java基礎(chǔ)之try-with-resource語法糖,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-02-02深度剖析Java成員變量、局部變量和靜態(tài)變量的創(chuàng)建和回收時(shí)機(jī)
這篇文章主要介紹了深度剖析Java成員變量、局部變量和靜態(tài)變量的創(chuàng)建和回收時(shí)機(jī),成員變量是定義在類中的變量,每個(gè)類的實(shí)例都會(huì)擁有自己的成員變量。它們的生命周期與對(duì)象的創(chuàng)建和銷毀相對(duì)應(yīng),下面我將詳細(xì)介紹它們的特點(diǎn)和生命周期,需要的朋友可以參考下2023-07-07