◉◡◉ 您好,欢迎到访伊成个人站!

java通过反射获取注解@Column中的信息

背景

在工作中需要从实体类的@Column注解中获取对应的信息,先一个实体类的上代码,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
package com.devcheng.demo.restful.data.service.model.entity;

import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import lombok.Data;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import java.time.LocalDateTime;

@Data
@Entity
@Table(name = "DEV_CHENG_FILE_DEMO")
public class DiscloseFileEntity{

@Id
@Column(name = "ID",columnDefinition = "ID")
private String id;

@Column(name = "APPLY_NO",columnDefinition = "申请号")
private String applyNo;

@Column(name = "FILE_NAME",columnDefinition = "文件名称")
private String fileName;

@Column(name = "FILE_SIZE",columnDefinition = "文件大小")
private String fileSize;

@Column(name = "TITLE",columnDefinition = "标题")
private String title;

@Column(name = "IS_VALID",columnDefinition = "是否有效")
private String isValid;

@Column(name = "SAVE_DATE",columnDefinition = "保存日期")
private LocalDateTime saveDate;

}

由上得知,需要从 @Column 注解中获取 name和columnDefinition 中的信息,那如何可以获取到对应的信息?

在获取 @Column 注解中的信息之前,先看看 columnDefinition是啥意思?

columnDefinition

columnDefinition属性表示创建表时,该字段创建的SQL语句,一般用于通过Entity生成表定义时使用,如果数据库中表已经建好,该属性没有必要使用。

值得注意的一点是:在编程语言中字符串一般都用String表示,但是数据库中varcahr数值类型有长度限制,一旦需要大文本,则需要text数值类型。但是String类型默认映射的数值类型是varchar,columnDefinition可以进行额外指定。

获取注解@Column中的信息

实现思路:通过类路径利用反射获取到对应的注解信息,从而获取到对应@Column中的信息
代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public static List<TableColumnsVO> getFiledAndAnnotateInfo(String entityPath)
{
List<TableColumnsVO> tableColumnsLists = new ArrayList<>();
try {
Class<?> aClass = Class.forName(entityPath);
Field[] fields = aClass.getDeclaredFields();

Column presentColumn;
for (Field field:fields)
{
field.setAccessible(true);
if(field.isAnnotationPresent(Column.class))
{
presentColumn = field.getDeclaredAnnotation(Column.class);
TableColumnsVO tableData = new TableColumnsVO();
tableData.setColumnName(presentColumn.name());
tableData.setColumnDefinationInfo(presentColumn.columnDefinition());
tableColumnsLists.add(tableData);
}

}
} catch (ClassNotFoundException e) {
log.info(String.format("获取字段和注释异常:%s", entityPath));
}
return tableColumnsLists;
}

对应的 TableColumnsVO代码如下:

1
2
3
4
5
6
7
8
9
import lombok.Data;

@Data
public class TableColumnsVO{
//列名
private String columnName;
//ColumnDefinationInfo信息
private String columnDefinationInfo;
}

支付宝打赏 微信打赏