JPA - @Convert屬性映射轉換器


前言

@Convert屬性轉換器用於數據庫屬性類型與java存儲的類型做轉換,其方便之處在於存儲與讀取的時候能自動轉換,如下業務場景:
業務對象存在一個Map或List屬性,存入數據庫時需保存為json字符串,返回前端時以對象來返回。

@Convert屬性轉換器需實現AttributeConverter<X, Y>接口,第一個泛型類型為Entity字段類型,第二個泛型類型為數據庫字段類型。

具體實現

Map與JSON的屬性轉換器

  • MapAndJson.java
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import javax.persistence.AttributeConverter;
import java.util.HashMap;
import java.util.Map;

/**
 * @Description Map與JSON映射轉換器
 * @author coisini
 * @date Aug 16, 2021
 * @Version 1.0
 */
public class MapAndJson implements AttributeConverter<Map<String, Object>, String> {

    @Autowired
    private ObjectMapper mapper;

    /**
     * 轉換成數據庫字段
     * @param stringObjectMap
     * @return
     */
    @Override
    public String convertToDatabaseColumn(Map<String, Object> stringObjectMap) {
        try {
            return mapper.writeValueAsString(stringObjectMap);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
    }

    /**
     * 轉換成實體字段
     * @param s
     * @return
     */
    @Override
    @SuppressWarnings("unchecked")
    public Map<String, Object> convertToEntityAttribute(String s) {
        try {
            return mapper.readValue(s, HashMap.class);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
    }
}

List與JSON屬性轉換器

  • ListAndJson.java
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import javax.persistence.AttributeConverter;
import java.util.List;

/**
 * @Description List與JSON 映射轉換器
 * @author coisini
 * @date Aug 16, 2021
 * @Version 1.0
 */
public class ListAndJson implements AttributeConverter<List<Object>, String> {

    @Autowired
    private ObjectMapper mapper;

    @Override
    public String convertToDatabaseColumn(List<Object> objects) {
        try {
            return mapper.writeValueAsString(objects);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
    }

    @Override
    @SuppressWarnings("unchecked")
    public List<Object> convertToEntityAttribute(String s) {
        try {
            return mapper.readValue(s, List.class);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
    }
}

實體應用

@Convert(converter = MapAndJson.class)
private Map<String, Object> test;

@Convert(converter = ListAndJson.class)
private List<Object> specs;

效果圖

  • 數據庫

在這里插入圖片描述

  • 前端返回數據

在這里插入圖片描述


- End -
夢想是咸魚
關注一下吧


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM