Skip to content

Commit 99421eb

Browse files
committed
1. JPA enum support for Mysql
2. Adding more supported SQL data types
1 parent 41754ba commit 99421eb

File tree

11 files changed

+187
-54
lines changed

11 files changed

+187
-54
lines changed

src/main/java/io/github/ngbsn/generator/JPACodeGenerator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public static void main(final String[] args) throws TemplateException, IOExcepti
4242
* @throws TemplateException Thrown if template couldn't be processed
4343
*/
4444
public static void generateCode(final String sqlScript, final String packageName) throws IOException, TemplateException {
45-
logger.info("sql script {}", sqlScript);
45+
logger.debug("sql script {}", sqlScript);
4646
List<Table> tables = generateModels(sqlScript);
4747
processTemplate(tables, packageName);
4848
}

src/main/java/io/github/ngbsn/generator/ModelGenerator.java

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
11
package io.github.ngbsn.generator;
22

3-
import io.github.ngbsn.model.Column;
4-
import io.github.ngbsn.model.EmbeddableClass;
5-
import io.github.ngbsn.model.ForeignKeyConstraint;
6-
import io.github.ngbsn.model.Table;
3+
import io.github.ngbsn.model.*;
74
import io.github.ngbsn.model.annotations.entity.EntityAnnotation;
85
import io.github.ngbsn.model.annotations.entity.TableAnnotation;
96
import io.github.ngbsn.model.annotations.field.ColumnAnnotation;
7+
import io.github.ngbsn.model.annotations.field.EnumeratedAnnotation;
108
import io.github.ngbsn.model.annotations.field.NotNullAnnotation;
11-
import io.github.ngbsn.util.SQLToJavaMapping;
9+
import io.github.ngbsn.util.SQLTypeToJpaTypeMapping;
1210
import io.github.ngbsn.util.Util;
11+
import jakarta.persistence.EnumType;
1312
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
1413
import net.sf.jsqlparser.statement.Statements;
1514
import net.sf.jsqlparser.statement.alter.Alter;
1615
import net.sf.jsqlparser.statement.create.table.CreateTable;
1716
import net.sf.jsqlparser.statement.create.table.ForeignKeyIndex;
1817
import net.sf.jsqlparser.statement.create.table.Index;
18+
import org.apache.commons.text.WordUtils;
1919
import org.slf4j.Logger;
2020
import org.slf4j.LoggerFactory;
2121

@@ -93,7 +93,7 @@ private static void processCreateTableStatements(final Statements statements) {
9393
table.setColumns(columns);
9494

9595
//extract columns
96-
extractColumns(parsedTable, columns);
96+
extractColumns(table, parsedTable, columns);
9797

9898
//extract primary keys
9999
Optional<Index> optionalIndex = parsedTable.getIndexes().stream().filter(index -> index.getType().equals("PRIMARY KEY")).findFirst();
@@ -190,7 +190,7 @@ private static void extractPrimaryKeys(final Index primaryKeyIndex, final Table
190190
* @param parsedTable JSQL CreateTable
191191
* @param columns Set of generated column models
192192
*/
193-
private static void extractColumns(final CreateTable parsedTable, final Set<Column> columns) {
193+
private static void extractColumns(final Table table, final CreateTable parsedTable, final Set<Column> columns) {
194194
parsedTable.getColumnDefinitions().forEach(columnDefinition -> {
195195
Column column = new Column();
196196
columns.add(column);
@@ -200,7 +200,19 @@ private static void extractColumns(final CreateTable parsedTable, final Set<Colu
200200
//Adding @Column
201201
columnAnnotations.add(ColumnAnnotation.builder().columnName(column.getColumnName()).build().toString());
202202
column.setFieldName(Util.convertSnakeCaseToCamelCase(column.getColumnName(), false));
203-
column.setType(SQLToJavaMapping.getSqlToJavaMap().get(columnDefinition.getColDataType().getDataType()));
203+
if(columnDefinition.getColDataType().getDataType().equals("ENUM")){
204+
TableEnum tableEnum = new TableEnum();
205+
table.getTableEnums().add(tableEnum);
206+
tableEnum.setEnumName(WordUtils.capitalize(column.getColumnName()) + "Enum");
207+
List<String> values = tableEnum.getValues();
208+
for (String s : columnDefinition.getColDataType().getArgumentsStringList()) {
209+
values.add(s.replaceAll(REGEX_ALL_QUOTES, ""));
210+
}
211+
column.setType(tableEnum.getEnumName());
212+
columnAnnotations.add(EnumeratedAnnotation.builder().value(EnumType.STRING).build().toString());
213+
}else{
214+
column.setType(SQLTypeToJpaTypeMapping.getTypeMapping(columnDefinition.getColDataType().getDataType()));
215+
}
204216

205217
//Check for NOT NULL
206218
if (columnDefinition.getColumnSpecs() != null) {

src/main/java/io/github/ngbsn/model/Table.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,5 @@ public class Table {
2020
private int numOfPrimaryKeyColumns;
2121
private List<ForeignKeyConstraint> foreignKeyConstraints = new ArrayList<>();
2222
private Set<EmbeddableClass> embeddableClasses = new HashSet<>();
23+
private Set<TableEnum> tableEnums = new HashSet<>();
2324
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package io.github.ngbsn.model;
2+
3+
import lombok.Getter;
4+
import lombok.Setter;
5+
6+
import java.util.ArrayList;
7+
import java.util.List;
8+
9+
@Getter
10+
@Setter
11+
public class TableEnum {
12+
private String enumName;
13+
private List<String> values = new ArrayList<>();
14+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package io.github.ngbsn.model.annotations.field;
2+
3+
import io.github.ngbsn.model.annotations.Annotation;
4+
import jakarta.persistence.EnumType;
5+
import lombok.Builder;
6+
7+
@Builder
8+
public class EnumeratedAnnotation implements Annotation {
9+
private EnumType value;
10+
11+
@Override
12+
public String toString() {
13+
return "@Enumerated(EnumType." + value +")";
14+
}
15+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package io.github.ngbsn.model.annotations.field;
2+
3+
import io.github.ngbsn.model.annotations.Annotation;
4+
import lombok.Builder;
5+
6+
@Builder
7+
public class LobAnnotation implements Annotation {
8+
9+
@Override
10+
public String toString() {
11+
return "@Lob";
12+
}
13+
}

src/main/java/io/github/ngbsn/util/SQLToJavaMapping.java

Lines changed: 0 additions & 40 deletions
This file was deleted.
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
package io.github.ngbsn.util;
2+
3+
import java.util.HashMap;
4+
import java.util.Map;
5+
6+
public class SQLTypeToJpaTypeMapping {
7+
8+
private SQLTypeToJpaTypeMapping() {
9+
}
10+
11+
private static final Map<String, String> sqlToJavaMap = new HashMap<>();
12+
13+
public static final String STRING = "String";
14+
public static final String BYTE_ARRAY = "byte[]";
15+
public static final String DOUBLE = "double";
16+
public static final String INT = "int";
17+
public static final String FLOAT = "float";
18+
public static final String BIG_DECIMAL = "java.math.BigDecimal";
19+
20+
static {
21+
// Numeric Types
22+
sqlToJavaMap.put("NUMERIC", BIG_DECIMAL);
23+
sqlToJavaMap.put("DECIMAL", BIG_DECIMAL);
24+
sqlToJavaMap.put("TINYINT", "byte");
25+
sqlToJavaMap.put("SMALLINT", "short");
26+
sqlToJavaMap.put("MEDIUMINT", INT);
27+
sqlToJavaMap.put("INTEGER", INT);
28+
sqlToJavaMap.put("INT", INT);
29+
sqlToJavaMap.put("BIGINT", "long");
30+
sqlToJavaMap.put("LONG", "long");
31+
sqlToJavaMap.put("REAL", FLOAT);
32+
sqlToJavaMap.put("BINARY_FLOAT", DOUBLE);
33+
sqlToJavaMap.put("BINARY_DOUBLE", DOUBLE);
34+
sqlToJavaMap.put("FLOAT", DOUBLE);
35+
sqlToJavaMap.put("DOUBLE", DOUBLE);
36+
sqlToJavaMap.put("DOUBLE PRECISION", DOUBLE);
37+
sqlToJavaMap.put("SMALLSERIAL", INT);
38+
sqlToJavaMap.put("SERIAL", INT);
39+
sqlToJavaMap.put("BIGSERIAL", INT);
40+
41+
//Boolean types
42+
sqlToJavaMap.put("BIT", "boolean");
43+
sqlToJavaMap.put("BOOLEAN", "boolean");
44+
45+
//Date and Time Types
46+
sqlToJavaMap.put("DATE", "java.sql.Date");
47+
sqlToJavaMap.put("TIME", "java.sql.Time");
48+
sqlToJavaMap.put("TIMESTAMP", "java.sql.Timestamp");
49+
sqlToJavaMap.put("DATETIME", "java.sql.Timestamp"); // Use @Temporal
50+
51+
//String Types
52+
sqlToJavaMap.put("CHARACTER", STRING);
53+
sqlToJavaMap.put("CHAR", STRING);
54+
sqlToJavaMap.put("VARYING", STRING);
55+
sqlToJavaMap.put("CHARACTER VARYING", STRING);
56+
sqlToJavaMap.put("CHAR VARYING", STRING);
57+
sqlToJavaMap.put("NATIONAL CHARACTER", STRING);
58+
sqlToJavaMap.put("NATIONAL CHAR", STRING);
59+
sqlToJavaMap.put("NCHAR", STRING);
60+
sqlToJavaMap.put("NATIONAL CHARACTER VARYING", STRING);
61+
sqlToJavaMap.put("NATIONAL CHAR VARYING", STRING);
62+
sqlToJavaMap.put("NCHAR VARYING", STRING);
63+
sqlToJavaMap.put("BPCHAR", STRING);
64+
sqlToJavaMap.put("VARCHAR", STRING);
65+
sqlToJavaMap.put("VARCHAR2", STRING);
66+
sqlToJavaMap.put("NVARCHAR2", STRING);
67+
sqlToJavaMap.put("LONGVARCHAR", STRING);
68+
sqlToJavaMap.put("LONG VARCHAR", STRING);
69+
70+
// Use @Lob
71+
sqlToJavaMap.put("BYTEA", STRING);
72+
sqlToJavaMap.put("CLOB ", STRING);
73+
sqlToJavaMap.put("NCLOB ", STRING);
74+
sqlToJavaMap.put("TINYTEXT ", STRING);
75+
sqlToJavaMap.put("TEXT ", STRING);
76+
sqlToJavaMap.put("MEDIUMTEXT ", STRING);
77+
sqlToJavaMap.put("LONGTEXT ", STRING);
78+
79+
sqlToJavaMap.put("TINYBLOB ", BYTE_ARRAY);
80+
sqlToJavaMap.put("BLOB ", BYTE_ARRAY);
81+
sqlToJavaMap.put("MEDIUMBLOB ", BYTE_ARRAY);
82+
sqlToJavaMap.put("LONGBLOB ", BYTE_ARRAY);
83+
84+
sqlToJavaMap.put("RAW", BYTE_ARRAY);
85+
sqlToJavaMap.put("LONG RAW", BYTE_ARRAY);
86+
sqlToJavaMap.put("BINARY", BYTE_ARRAY);
87+
sqlToJavaMap.put("VARBINARY", BYTE_ARRAY);
88+
sqlToJavaMap.put("LONGVARBINARY", BYTE_ARRAY);
89+
90+
}
91+
92+
/**
93+
* Return the JPA type mapping for a SQL type
94+
* @param dataType SQL type
95+
* @return JPA type
96+
*/
97+
public static String getTypeMapping(final String dataType) {
98+
return sqlToJavaMap.get(dataType.toUpperCase());
99+
}
100+
101+
}

src/main/resources/templates/entity.ftl

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,19 @@ import ${import};
1111
${annotation}
1212
</#list>
1313
public class ${table.className}{
14+
15+
<#list table.tableEnums as tableEnum>
16+
enum ${tableEnum.enumName}{
17+
<#list tableEnum.values as value>
18+
<#if value?is_last>
19+
${value}
20+
<#else>
21+
${value},
22+
</#if>
23+
</#list>
24+
}
25+
</#list>
26+
1427
<#if (table.numOfPrimaryKeyColumns > 1) >
1528
<#list table.embeddableClasses as embeddableClass>
1629
@Getter
@@ -23,8 +36,9 @@ public class ${table.className}{
2336
${annotation}
2437
</#list>
2538
private ${column.type} ${column.fieldName};
39+
2640
</#list>
27-
}
41+
}
2842

2943
<#if embeddableClass.embeddedId == true>
3044
@EmbeddedId
@@ -39,6 +53,7 @@ public class ${table.className}{
3953
</#list>
4054
private ${column.type} ${column.fieldName};
4155
</#if>
56+
4257
</#list>
4358
<#else>
4459
<#list table.columns as column>
@@ -50,6 +65,7 @@ public class ${table.className}{
5065
${annotation}
5166
</#list>
5267
private ${column.type} ${column.fieldName};
68+
5369
</#list>
5470
</#if>
5571
}

src/test/resources/sql/mysql.sql

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ CREATE TABLE organization.employees (
1313
first_name VARCHAR(14) NOT NULL,
1414
last_name VARCHAR(16) NOT NULL,
1515
hire_date DATE NOT NULL,
16+
grade ENUM('E1', 'E2', 'E3', 'M1', 'M2', 'M3'),
1617
PRIMARY KEY (emp_no)
1718
);
1819

src/test/resources/sql/postgres.sql

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
CREATE TABLE "Album"
22
(
3-
"AlbumId" INT NOT NULL,
4-
"Title" VARCHAR(160) NOT NULL,
3+
"AlbumId" int NOT NULL,
4+
"Title" varchar(160) NOT NULL,
55
"ArtistId" INT NOT NULL,
66
CONSTRAINT "PK_Album" PRIMARY KEY ("AlbumId")
77
);
88

99
CREATE TABLE "Artist"
1010
(
11-
"ArtistId" INT NOT NULL,
12-
"Name" VARCHAR(120),
11+
"ArtistId" int NOT NULL,
12+
"Name" varchar(120),
1313
CONSTRAINT "PK_Artist" PRIMARY KEY ("ArtistId")
1414
);
1515

0 commit comments

Comments
 (0)