springDataJpa入門教程
-
springDataJpa入門教程(1)-基於springBoot的基本增刪改查
-
springDataJpa入門教程(2)-Specification動態條件查詢+排序+分頁
-
springDataJpa入門教程(3-1)-基於EntityManager原生sql多表聯合查詢+動態條件查詢+分頁
-
springDataJpa入門教程(3-2)-基於EntityManager原生sql多表聯合查詢+動態條件查詢+分頁返回自定義實體類對象
-
springDataJpa入門教程(4)-Example單表動態條件查詢+分頁
-
springDataJpa入門教程(5)-單表動態條件查詢+分頁
-
springDataJpa入門教程(6)-多表動態條件查詢+分頁
-
springDataJpa入門教程(7)-基於springDataJpa投影(Projection)返回自定義實體類對象
-
springDataJpa入門教程(8)-JPA EnableJpaAuditing 審計功能
-
springDataJpa入門教程(9)-spring jpa實體屬性類型轉換器AttributeConverter的用法
-
springDataJpa入門教程(10)-JPA使用過程中遇到的坑及解決方法
springDataJpa入門教程(9)-spring jpa實體屬性類型轉換器AttributeConverter的用法
有些情況下,實體類的屬性和數據庫的字段類型並不是一一對應的關係,比如說實體類的某個屬性爲枚舉類型,而數據庫字段是整型,這種情況下,需要藉助JPA提供AttributeConverter接口來完全實體類屬性和數據庫字段之間的映射。下面以User實體類爲例,講講AttributeConverter屬性轉換器的用法。
首先,來看一下User類的代碼:
import com.thizgroup.jpa.study.converter.SexEnumAttributeConverter;
import com.thizgroup.jpa.study.enums.SexEnum;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Convert;
import javax.persistence.Entity;
import javax.persistence.Table;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Entity
@Table(name = "tb_user")
@Data//使用lombok生成getter、setter
@NoArgsConstructor//生成無參構造方法
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
protected Long id;
@Column(name = "name",columnDefinition = "varchar(64)")
private String name;
@Column(name = "mobile",columnDefinition = "varchar(64)")
private String mobile;
@Column(name="sex",columnDefinition = "int(1)")
private SexEnum sex;
}
User類中,有個性別屬性sex,它的類型是枚舉類型,SexEnum.java如下:
import lombok.Getter;
@Getter
public enum SexEnum {
MAN(1,"男"),
WOMAN(2,"女");
private Integer code;
private String msg;
private SexEnum(Integer code,String msg){
this.code = code;
this.msg = msg;
}
sex屬性對應的數據庫表字段類型爲int(1),數據庫中它是這樣的,
爲了解決屬性轉換的問題,我們來定義一個屬性轉換器類,並實現AttributeConverter接口。
AttributeConverter<X,Y>該接口中需要實現兩個方法:
- y convertToDatabaseColumn(x) 作用:將實體屬性x轉化爲y存儲到數據庫中,即插入和更新操作時執行;
- x convertToEntityAttribute(y) 作用:將數據庫中的字段y轉化爲實體屬性x,即查詢操作時執行。
import com.thizgroup.jpa.study.enums.SexEnum;
import javax.persistence.AttributeConverter;
import javax.persistence.Converter;
@Converter(autoApply = true)//autoApply爲true表示這個轉換器被自動應用到所有的entity
public class SexEnumAttributeConverter implements AttributeConverter<SexEnum,Integer> {
@Override
public Integer convertToDatabaseColumn(SexEnum sexEnum) {
if(sexEnum == null) return null;
return sexEnum.getCode();
}
@Override
public SexEnum convertToEntityAttribute(Integer code) {
if(code == null) return null;
SexEnum[] values = SexEnum.values();
for(SexEnum sexEnum : values) {
if(code.equals(sexEnum.getCode())) return sexEnum;
}
throw new IllegalArgumentException("無效的SexEnum:"+code);
}
}
AttributeConverter屬性轉換器要配合@Converter註解來使用,@Converter註解的作用是告訴JPA這是一個屬性轉換器,autoApply =true的作用是表示這是一個全局的屬性轉換器,也就是說這個轉換器對所有的實體類都起作用,
AttributeConverter有兩個泛型參數:
- 第一個參數表示實體類中需要被轉換的屬性類型。
- 第二個參數表示與數據庫表字段對應的java類型。
因此,這裏的泛型分別是SexEnum和Integer。
接下來就是重寫AttributeConverter接口的兩個方法來實現屬性之間的轉換。
注意:SexEnumAttributeConverter 類必須位於@EntityScan註解的包路徑下,否則轉換器將不起作用。代碼如下:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
@SpringBootApplication
//配置springDataJpa掃描Repository的包路徑
@EntityScan(basePackages = {"com.thizgroup.jpa.study.model","com.thizgroup.jpa.study.dto"
,"com.thizgroup.jpa.study.converter"})
@EnableJpaRepositories("com.thizgroup.jpa.study.dao")
@EnableJpaAuditing//啓動jpa審計功能
public class JpaApplication {
public static void main(String[] args) {
SpringApplication.run(JpaApplication.class,args);
}
}
上面講的這種方式是將AttributeConverter轉化器作用於全局,對所有的實體類都起作用,但是在實際開發中,我們可能需要對某個實體類的屬性的轉換做特殊處理,那這種情況下,該怎麼辦呢?@Convert註解可以幫我們解決這個問題,將@Convert註解直接定義在實體類的屬性上,也同樣能實現屬性之間的轉換,代碼如下:
import com.thizgroup.jpa.study.converter.SexEnumAttributeConverter;
import com.thizgroup.jpa.study.enums.SexEnum;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Convert;
import javax.persistence.Entity;
import javax.persistence.Table;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Entity
@Table(name = "tb_user")
@Data//使用lombok生成getter、setter
@NoArgsConstructor//生成無參構造方法
public class User{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
protected Long id;
@Column(name = "name",columnDefinition = "varchar(64)")
private String name;
@Column(name = "mobile",columnDefinition = "varchar(64)")
private String mobile;
@Convert(converter = SexEnumAttributeConverter.class)
@Column(name="sex",columnDefinition = "int(1)")
private SexEnum sex;
}
好了,AttributeConverter的用法介紹就到此結束了,有需要源碼的朋友,請到git上下載源碼,源碼地址:https://github.com/hgq0916/springdatajpa-study.git。java學習交流羣:184998348,歡迎大家一起交流學習。