最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java巧用@Convert實(shí)現(xiàn)表字段自動(dòng)轉(zhuǎn)entity

 更新時(shí)間:2024年07月26日 09:27:45   作者:螺螄小公雞  
本文主要介紹了java巧用@Convert實(shí)現(xiàn)表字段自動(dòng)轉(zhuǎn)entity,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

1.背景

本人自入職以來(lái),接了一堆歷史包(shi)袱(shan),其中有個(gè)服務(wù)是基于MongoDB實(shí)現(xiàn)的,而公司要搞信創(chuàng)化,去掉MongoDB是遲早的事,于是便開(kāi)始分析底層數(shù)據(jù)結(jié)構(gòu),計(jì)劃用pg替換MongoDB。

2.難點(diǎn)

2.1 數(shù)據(jù)結(jié)構(gòu)不同

MongoDB是文檔型數(shù)據(jù)庫(kù),而pg是關(guān)系型數(shù)據(jù)庫(kù),原項(xiàng)目MongoDB的collection中某些字段類(lèi)型為L(zhǎng)ist或者entity,存在一對(duì)多的情況,如果采用新建關(guān)聯(lián)表的方式,會(huì)增加數(shù)據(jù)結(jié)構(gòu)復(fù)雜性,且底層數(shù)據(jù)幾乎不會(huì)變,因此,覺(jué)得直接用VARCHAR類(lèi)型存儲(chǔ)List類(lèi)型的json串。

2.2 數(shù)據(jù)類(lèi)型轉(zhuǎn)換

服務(wù)的數(shù)據(jù)庫(kù)持久化使用的是jpa,原來(lái)MongoDB類(lèi)型會(huì)自動(dòng)轉(zhuǎn)成List,如下列的options屬性

@Data
@Document(collection = "input_item")
public class InputItem implements Comparable<InputItem> {

   @Id
   private String itemCode;
   
   private String title;
   private String description;
   private int itemType;
   private List<InputItemOption> options;
   private String defaultOptionNum;
   private String unit;
   private boolean whetherActive;
}

轉(zhuǎn)成pg后,options字段在數(shù)據(jù)庫(kù)中是String類(lèi)型,需要轉(zhuǎn)成List。經(jīng)過(guò)調(diào)研,可以采用自定義Converter+注解@Convert來(lái)實(shí)現(xiàn)。

2.2.1 List類(lèi)型

1)自定義Converter

import com.alibaba.fastjson.JSON;
import javax.persistence.AttributeConverter;
/**
 * @ClassName JpaConverterListJson
 * @Description jpa list轉(zhuǎn)換為String 相互轉(zhuǎn)換工具類(lèi)
 * @Author ygt
 * @Date 2021/3/3 14:49
 * @Version V1.0
 */
public class JpaConverterListJson  implements AttributeConverter<Object, String> {
    @Override
    public String convertToDatabaseColumn(Object o) {
        return JSON.toJSONString(o);
    }

    @Override
    public Object convertToEntityAttribute(String s) {
        return JSON.parseArray(s);
    }
}

2)@Convert注解

import java.util.List;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.swagger.annotations.ApiModel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.NoArgsConstructor;

import lombok.Data;

import javax.persistence.*;

/**
 * 
 * @Description 輸入項(xiàng)實(shí)體類(lèi)
 *
 */
@ApiModel("")
@JsonInclude(value = JsonInclude.Include.NON_NULL)
@Table(name = "input_item")
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Data
@Entity
public class InputItem implements Comparable<InputItem> {

   @GeneratedValue
   @Column(name = "id")
   @Id
   private String itemCode;

   @Column(name = "title")
   private String title;
   @Column(name = "description")
   private String description;
   @Column(name = "itemtype")
   private int itemType;

   @Convert(converter = JpaConverterListJson.class)
   private List<InputItemOption> options;
   @Column(name = "defaultoptionnum")
   private String defaultOptionNum;
   @Column(name = "unit")
   private String unit;
   @Column(name = "whetheractive")
   private Boolean whetherActive;

   @Override
   public int compareTo(InputItem o) {
      int index1 = Integer.parseInt(this.itemCode.substring(this.itemCode.lastIndexOf('_') + 1));
      int index2 = Integer.parseInt(o.itemCode.substring(o.itemCode.lastIndexOf('_') + 1));
      if (index1 < index2) {
         return -1;
      }
      else {
         return 1;
      }
   }
}

2.2.2 entity類(lèi)型

1)自定義Converter

import com.alibaba.fastjson.JSON;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.test.src.domain.index.interest.InterestCreditScoreSection;

import javax.persistence.AttributeConverter;
import java.lang.reflect.ParameterizedType;

/**
 * @ClassName JpaConverterListJson
 * @Description jpa 泛型T轉(zhuǎn)換為String 相互轉(zhuǎn)換工具類(lèi)
 * @Author ygt
 * @Date 2021/3/3 14:49
 * @Version V1.0
 */
public class JpaConverterObjectJson<T> implements AttributeConverter<T, String> {

    private static final ObjectMapper objectMapper = new ObjectMapper();

    @Override
    public String convertToDatabaseColumn(T o) {
        try {
            return objectMapper.writeValueAsString(o);
        } catch (Exception e) {
            throw new RuntimeException("Failed to convert object to string", e);
        }
    }

    @Override
    public T convertToEntityAttribute(String s) {
        try {
            return objectMapper.readValue(s, (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]);
        } catch (Exception e) {
            throw new RuntimeException("Failed to convert string to object", e);
        }
    }
}
import com.test.src.domain.index.interest.InterestCreditScoreSection;

public class InterestCreditScoreSectionConverter extends JpaConverterObjectJson<InterestCreditScoreSection>{
}

2)@Convert注解

import com.fasterxml.jackson.annotation.JsonInclude;
import com.test.src.utils.InterestCreditScoreSectionConverter;
import io.swagger.annotations.ApiModel;
import lombok.NoArgsConstructor;

import lombok.*;

import javax.persistence.*;

/**
 * 
 * @Description 利率授信實(shí)體類(lèi)
 */
@ApiModel("")
@JsonInclude(value = JsonInclude.Include.NON_NULL)
@Table(name = "interest_credit")
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Data
@Entity
public class InterestCredit {

   @Id
   @GeneratedValue
   @Column(name = "id")
   private String itemNo;

   @Column(name = "recommendinterestformula")
   private String recommendInterestFormula; //推薦執(zhí)行利率計(jì)算公式;

   @Convert(converter = InterestCreditScoreSectionConverter.class)
   @Column(name = "interestcreditscoresection")
   private InterestCreditScoreSection interestCreditScoreSection;
}

3.總結(jié)

針對(duì)不好處理的json string類(lèi)型,可通過(guò)自定義converter+@Convert的方式實(shí)現(xiàn)自動(dòng)轉(zhuǎn)換,另外,可在自定義converter類(lèi)上加@Convert(autoApply = true)實(shí)現(xiàn)全局自動(dòng)轉(zhuǎn)換。

到此這篇關(guān)于java巧用@Convert實(shí)現(xiàn)表字段自動(dòng)轉(zhuǎn)entity的文章就介紹到這了,更多相關(guān)java 表字段自動(dòng)轉(zhuǎn)entity內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mybatis-plus插入失敗的問(wèn)題及解決

    mybatis-plus插入失敗的問(wèn)題及解決

    這篇文章主要介紹了mybatis-plus插入失敗的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Java接口返回json如何忽略特定屬性

    Java接口返回json如何忽略特定屬性

    這篇文章主要介紹了Java接口返回json如何忽略特定屬性,通過(guò)SimplePropertyPreFilter方式(Json返回),這種寫(xiě)法,接口返回類(lèi)型就要求是Json字符串類(lèi)型,本文通過(guò)場(chǎng)景實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • ProtoStuff不支持BigDecimal序列化及反序列化詳解

    ProtoStuff不支持BigDecimal序列化及反序列化詳解

    這篇文章主要為大家介紹了ProtoStuff不支持BigDecimal序列化/反序列化,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • IDEA中項(xiàng)目集成git提交代碼的詳細(xì)步驟

    IDEA中項(xiàng)目集成git提交代碼的詳細(xì)步驟

    這篇文章主要介紹了IDEA中項(xiàng)目集成git提交代碼的詳細(xì)步驟,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • eclipse輸出Hello World的實(shí)現(xiàn)方法

    eclipse輸出Hello World的實(shí)現(xiàn)方法

    這篇文章主要介紹了eclipse輸出Hello World的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Spring.Net控制反轉(zhuǎn)IoC入門(mén)使用

    Spring.Net控制反轉(zhuǎn)IoC入門(mén)使用

    這篇文章主要為大家詳細(xì)介紹了Spring.Net控制反轉(zhuǎn)IoC入門(mén)使用的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • spring 重復(fù)注解和aop攔截的實(shí)現(xiàn)示例

    spring 重復(fù)注解和aop攔截的實(shí)現(xiàn)示例

    本文主要介紹了spring 重復(fù)注解和aop攔截的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-08-08
  • java利用Future實(shí)現(xiàn)多線程執(zhí)行與結(jié)果聚合實(shí)例代碼

    java利用Future實(shí)現(xiàn)多線程執(zhí)行與結(jié)果聚合實(shí)例代碼

    這篇文章主要給大家介紹了關(guān)于java利用Future實(shí)現(xiàn)多線程執(zhí)行與結(jié)果聚合的相關(guān)資料,Future模式的核心,去除了主函數(shù)的等待時(shí)間,并使得原本需要等待的時(shí)間段可以用于處理其他業(yè)務(wù)邏輯,需要的朋友可以參考下
    2021-12-12
  • Java中jakarta.validation數(shù)據(jù)校驗(yàn)幾個(gè)主要依賴包講解

    Java中jakarta.validation數(shù)據(jù)校驗(yàn)幾個(gè)主要依賴包講解

    在Java開(kāi)發(fā)中,BeanValidationAPI提供了一套標(biāo)準(zhǔn)的數(shù)據(jù)驗(yàn)證機(jī)制,尤其是通過(guò)JakartaBeanValidation(原HibernateValidator)實(shí)現(xiàn),文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-09-09
  • Java并發(fā)編程service層處理并發(fā)事務(wù)加鎖可能會(huì)無(wú)效問(wèn)題

    Java并發(fā)編程service層處理并發(fā)事務(wù)加鎖可能會(huì)無(wú)效問(wèn)題

    這篇文章主要介紹了Java并發(fā)編程service層處理并發(fā)事務(wù)加鎖可能會(huì)無(wú)效問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07

最新評(píng)論

竹溪县| 灵寿县| 历史| 土默特右旗| 轮台县| 潜江市| 南投市| 垣曲县| 呈贡县| 乾安县| 连州市| 丰镇市| 微博| 建水县| 长垣县| 凌海市| 宜宾市| 遂溪县| 孝昌县| 宜章县| 隆德县| 大荔县| 班玛县| 潼南县| 百色市| 崇州市| 龙江县| 福清市| 菏泽市| 石阡县| 高碑店市| 北辰区| 吉首市| 鄂托克前旗| 邵阳县| 栾城县| 通河县| 苍溪县| 宕昌县| 洛浦县| 丹阳市|