From 665b295a9657b47efc561f82dee6ab37e858bf04 Mon Sep 17 00:00:00 2001 From: redkale Date: Sun, 24 Mar 2024 21:05:41 +0800 Subject: [PATCH] =?UTF-8?q?EntityBuilder=E6=94=AF=E6=8C=81=E4=B8=8B?= =?UTF-8?q?=E5=88=92=E7=BA=BF=E5=B0=8F=E5=86=99=E5=AD=97=E6=AE=B5=E8=BD=AC?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/redkale/source/EntityBuilder.java | 34 ++++++++++++++++++- .../org/redkale/test/cache/CacheInstance.java | 3 +- 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/redkale/source/EntityBuilder.java b/src/main/java/org/redkale/source/EntityBuilder.java index bf26be7a2..f61879bc1 100644 --- a/src/main/java/org/redkale/source/EntityBuilder.java +++ b/src/main/java/org/redkale/source/EntityBuilder.java @@ -25,6 +25,8 @@ public class EntityBuilder { private static final ConcurrentHashMap cacheMap = new ConcurrentHashMap<>(); + private static final ConcurrentHashMap lowerMap = new ConcurrentHashMap<>(); + private static final ConcurrentHashMap snakeMap = new ConcurrentHashMap<>(); private static final ConcurrentHashMap camelMap = new ConcurrentHashMap<>(); @@ -61,6 +63,9 @@ public class EntityBuilder { //key:数据库字段名 private final Map> sqlAttrMap; + //key:数据库字段名去掉下划线并小写 + private final Map> sqlLowerAttrMap; + //数据库中所有字段, 顺序必须与querySqlColumns、querySqlColumnSequence一致 private final Attribute[] attributes; @@ -79,8 +84,13 @@ public class EntityBuilder { this.attributeMap = attributeMap; this.attributes = queryAttributes; this.sqlAttrMap = new HashMap<>(); + this.sqlLowerAttrMap = new HashMap<>(); this.entityIsMap = Map.class.isAssignableFrom(type); - attributeMap.forEach((k, v) -> sqlAttrMap.put(getSQLColumn(null, k), v)); + attributeMap.forEach((k, v) -> { + String col = getSQLColumn(null, k); + sqlAttrMap.put(col, v); + sqlLowerAttrMap.put(lowerCaseColumn(col), v); + }); } public static boolean isSimpleType(Class type) { @@ -248,6 +258,24 @@ public class EntityBuilder { return getObjectValue(null, row); } + //去掉字段名中的下划线并转出小写 + protected String lowerCaseColumn(String sqlCol) { + return lowerMap.computeIfAbsent(sqlCol, col -> { + char ch; + char[] chs = col.toCharArray(); + StringBuilder sb = new StringBuilder(chs.length); + for (int i = 0; i < chs.length; i++) { + ch = chs[i]; + if ((ch >= 'a' && ch <= 'z') || (ch >= '0' && ch <= '9')) { + sb.append(ch); + } else if (ch >= 'A' && ch <= 'Z') { + sb.append(Character.toLowerCase(ch)); + } + } + return sb.toString(); + }); + } + //带下划线的字段名替换成驼峰式 protected String snakeCaseColumn(String sqlCol) { return snakeMap.computeIfAbsent(sqlCol, col -> { @@ -308,6 +336,10 @@ public class EntityBuilder { attr = attrs.get(snakeCaseColumn(sqlCol)); sqlFlag = true; } + if (attr == null) { + attr = sqlLowerAttrMap.get(lowerCaseColumn(sqlCol)); + sqlFlag = true; + } if (attr != null) { //兼容返回的字段不存在类中 if (sqlFlag) { attr.set(obj, getFieldValue(row, sqlCol)); diff --git a/src/test/java/org/redkale/test/cache/CacheInstance.java b/src/test/java/org/redkale/test/cache/CacheInstance.java index c118acb12..c986ace73 100644 --- a/src/test/java/org/redkale/test/cache/CacheInstance.java +++ b/src/test/java/org/redkale/test/cache/CacheInstance.java @@ -67,7 +67,8 @@ public class CacheInstance implements Service { } @Cached(key = "info_#{id}_file#{files.one}", localExpire = "30", remoteExpire = "60", timeUnit = TimeUnit.MILLISECONDS) - public CompletableFuture> getInfo2Async(ParamBean bean, int id, List idList, Map files) throws IOException, InstantiationException { + public CompletableFuture> getInfo2Async(ParamBean bean, + int id, List idList, Map files) throws IOException, InstantiationException { return CompletableFuture.completedFuture(null); }