From a8b1ab527f86cd8702e8515437df86a811bce6bc Mon Sep 17 00:00:00 2001 From: holmofy <hff1996723@163.com> Date: Mon, 2 Oct 2023 13:56:39 +0800 Subject: [PATCH] #4 support sql render --- pom.xml | 2 +- .../holmofy/data/apt/CriteriaGenerator.java | 19 ++++++++++++++----- .../src/test/resources/TestModel_.java | 16 +++++++++++++++- .../data/jdbc/controller/UserController.java | 11 ++++++++--- .../github/holmofy/data/jdbc/dao/UserDao.java | 18 +++++++++++++++++- 5 files changed, 55 insertions(+), 11 deletions(-) diff --git a/pom.xml b/pom.xml index 6d98ded..dc4007b 100644 --- a/pom.xml +++ b/pom.xml @@ -54,7 +54,7 @@ <maven.flatten.version>1.4.1</maven.flatten.version> <maven.source.version>3.2.1</maven.source.version> <maven.javadoc.version>3.5.0</maven.javadoc.version> - <reversion>3.1.3</reversion> + <reversion>3.2.0</reversion> </properties> <dependencyManagement> diff --git a/spring-data-criteria-apt/src/main/java/io/github/holmofy/data/apt/CriteriaGenerator.java b/spring-data-criteria-apt/src/main/java/io/github/holmofy/data/apt/CriteriaGenerator.java index 5012daf..800593b 100644 --- a/spring-data-criteria-apt/src/main/java/io/github/holmofy/data/apt/CriteriaGenerator.java +++ b/spring-data-criteria-apt/src/main/java/io/github/holmofy/data/apt/CriteriaGenerator.java @@ -9,6 +9,7 @@ import org.springframework.data.relational.core.mapping.Column; import org.springframework.data.relational.core.mapping.Embedded; import org.springframework.data.relational.core.mapping.Table; +import org.springframework.data.relational.core.sql.SQL; import org.springframework.util.StringUtils; import javax.annotation.processing.Generated; @@ -74,7 +75,8 @@ public class TableModel { public static final String SPRING_DATA_PACKAGE = "org.springframework.data.relational.core.sql"; - private static final Converter<String, String> columnConverter = CaseFormat.LOWER_CAMEL.converterTo(CaseFormat.LOWER_UNDERSCORE); + private static final Converter<String, String> LOWER_UNDERSCORE = CaseFormat.LOWER_CAMEL.converterTo(CaseFormat.LOWER_UNDERSCORE); + private static final Converter<String, String> UPPER_UNDERSCORE = CaseFormat.LOWER_CAMEL.converterTo(CaseFormat.UPPER_UNDERSCORE); private PackageElement packageElement; @@ -97,8 +99,11 @@ public JavaFile generateSource() { // table name String tableName = getTableName(); builder.addField(FieldSpec.builder( - ClassName.get("java.lang", "String"), "TABLE", Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL + ClassName.get(String.class), "TABLE_NAME", Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL ).initializer("$S", tableName).build()); + builder.addField(FieldSpec.builder( + ClassName.get(org.springframework.data.relational.core.sql.Table.class), "TABLE", Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL + ).initializer("$T.table(TABLE_NAME)", SQL.class).build()); addFields(builder, this.fields, ""); @@ -135,10 +140,14 @@ private void addField(TypeSpec.Builder builder, VariableElement field, String co String column_name = Optional.of(field).map(f -> f.getAnnotation(Column.class)) .map(Column::value) .filter(s -> !s.isBlank()) - .orElse(columnConverter.convert(fieldName)); + .orElse(LOWER_UNDERSCORE.convert(fieldName)); builder.addField(FieldSpec.builder( - ClassName.get("java.lang", "String"), fieldName, Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL + ClassName.get(String.class), fieldName, Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL ).initializer("$S", columnPrefix + column_name).build()); + String COLUMN_NAME = Objects.requireNonNull(UPPER_UNDERSCORE.convert(fieldName)); + builder.addField(FieldSpec.builder( + ClassName.get(org.springframework.data.relational.core.sql.Column.class), COLUMN_NAME, Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL + ).initializer("$T.column($L, TABLE)", SQL.class, fieldName).build()); } public String getGenerateClassName() { @@ -155,7 +164,7 @@ private String getTableName() { return annotation.value(); } } - return columnConverter.convert(classElement.getSimpleName().toString()); + return LOWER_UNDERSCORE.convert(classElement.getSimpleName().toString()); } } diff --git a/spring-data-criteria-apt/src/test/resources/TestModel_.java b/spring-data-criteria-apt/src/test/resources/TestModel_.java index 9819d22..2ca4711 100644 --- a/spring-data-criteria-apt/src/test/resources/TestModel_.java +++ b/spring-data-criteria-apt/src/test/resources/TestModel_.java @@ -2,13 +2,27 @@ import java.lang.String; import javax.annotation.processing.Generated; +import org.springframework.data.relational.core.sql.Column; +import org.springframework.data.relational.core.sql.SQL; +import org.springframework.data.relational.core.sql.Table; @Generated("io.github.holmofy.data.apt.SpringDataRelationalAnnotationProcessor") public final class TestModel_ { - public static final String TABLE = "test_model"; + public static final String TABLE_NAME = "test_model"; + public static final Table TABLE = SQL.table(TABLE_NAME); + public static final String id = "id"; + public static final Column ID = SQL.column(id, TABLE); + public static final String withColumn = "named_column"; + public static final Column WITH_COLUMN = SQL.column(withColumn, TABLE); + public static final String lowerCamel = "lower_camel"; + public static final Column LOWER_CAMEL = SQL.column(lowerCamel, TABLE); + public static final String field1 = "embedded_field1"; + public static final Column FIELD1 = SQL.column(field1, TABLE); + public static final String field2 = "embedded_field_2"; + public static final Column FIELD2 = SQL.column(field2, TABLE); } \ No newline at end of file diff --git a/spring-data-criteria-example/spring-data-criteria-jdbc-example/src/main/java/io/github/holmofy/data/jdbc/controller/UserController.java b/spring-data-criteria-example/spring-data-criteria-jdbc-example/src/main/java/io/github/holmofy/data/jdbc/controller/UserController.java index 3515fa5..d42a6a9 100644 --- a/spring-data-criteria-example/spring-data-criteria-jdbc-example/src/main/java/io/github/holmofy/data/jdbc/controller/UserController.java +++ b/spring-data-criteria-example/spring-data-criteria-jdbc-example/src/main/java/io/github/holmofy/data/jdbc/controller/UserController.java @@ -21,9 +21,14 @@ public Page<User> search(UserDao.UserQuery query, Pageable pageable) { return userDao.searchByQuery(query, pageable); } - @GetMapping("/search-list") - public List<User> search(UserDao.UserQuery query) { - return userDao.searchByQuery(query); + @GetMapping("/search-list1") + public List<User> search1(UserDao.UserQuery query) { + return userDao.searchByQuery1(query); + } + + @GetMapping("/search-list2") + public List<User> search2(UserDao.UserQuery query) { + return userDao.searchByQuery2(query); } } diff --git a/spring-data-criteria-example/spring-data-criteria-jdbc-example/src/main/java/io/github/holmofy/data/jdbc/dao/UserDao.java b/spring-data-criteria-example/spring-data-criteria-jdbc-example/src/main/java/io/github/holmofy/data/jdbc/dao/UserDao.java index 699a842..b819a01 100644 --- a/spring-data-criteria-example/spring-data-criteria-jdbc-example/src/main/java/io/github/holmofy/data/jdbc/dao/UserDao.java +++ b/spring-data-criteria-example/spring-data-criteria-jdbc-example/src/main/java/io/github/holmofy/data/jdbc/dao/UserDao.java @@ -9,6 +9,10 @@ import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.relational.core.query.Criteria; +import org.springframework.data.relational.core.sql.Conditions; +import org.springframework.data.relational.core.sql.SQL; +import org.springframework.data.relational.core.sql.Select; +import org.springframework.data.relational.core.sql.render.SqlRenderer; import org.springframework.data.repository.ListCrudRepository; import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource; @@ -17,7 +21,19 @@ public interface UserDao extends ListCrudRepository<User, Long>, CriteriaExecutor<User>, JdbcSupport { - default List<User> searchByQuery(UserQuery query) { + default List<User> searchByQuery1(UserQuery query) { + Select sql = Select.builder().select() + .from(User_.TABLE) + .where(Conditions.isEqual(User_.PROVINCE, SQL.bindMarker(":province"))) + .and(Conditions.isEqual(User_.CITY, SQL.bindMarker(":city"))) + .and(Conditions.isEqual(User_.AREA, SQL.bindMarker(":area"))) + .and(Conditions.isEqual(User_.NAME, SQL.bindMarker(":nick"))) + .build(); + return namedJdbcTemplate().queryForList(SqlRenderer.toString(sql) + , new BeanPropertySqlParameterSource(query), User.class); + } + + default List<User> searchByQuery2(UserQuery query) { return namedJdbcTemplate().queryForList( "select * " + "from t_user " +