diff --git a/src/main/java/org/ylhealth/ym/springtest/hibernate/I18NPostProcessor.java b/src/main/java/org/ylhealth/ym/springtest/hibernate/I18NPostProcessor.java index 53790f89000c149e5f0e8a647847c480733bd2af..1627b6d40d83cd03adb95f821883fb77038629b1 100644 --- a/src/main/java/org/ylhealth/ym/springtest/hibernate/I18NPostProcessor.java +++ b/src/main/java/org/ylhealth/ym/springtest/hibernate/I18NPostProcessor.java @@ -25,7 +25,7 @@ import com.google.common.cache.CacheBuilder; /** * Spring data 取出後進行多國語系的替換 - * + * 快取多語資料 30 分鐘 */ public class I18NPostProcessor implements MethodInterceptor { private Logger logger = LoggerFactory.getLogger(getClass()); @@ -93,29 +93,34 @@ public class I18NPostProcessor implements MethodInterceptor { String language = LocaleContextHolder.getLocale().toString(); String table = i18n.table(); String idColumn = i18n.id(); + + Map> translateTable = translateTable(table, language, i18n.mapping(), idColumn); - String key = table + "_" + id + "_" + language; - Map result = cache.getIfPresent(key); + return translateTable.get(id); + } + + private Map> translateTable(String table, String language, I18NTranslate[] mapping, String idColumn) { + String key = "Table:" + table + "_" + language; + Map> result = cache.getIfPresent(key); if (result == null) { logger.trace("translate query, table: {}", table); String sql = - String.format("select * from %s where %s = ? and languageCode = ?", table, idColumn); + String.format("select * from %s where languageCode = ?", table); Query query = em.createNativeQuery(sql); SQLQuery query1 = query.unwrap(org.hibernate.SQLQuery.class); query1.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP); - for (I18NTranslate i18nTranslate : i18n.mapping()) { + query1.addScalar(idColumn); + for (I18NTranslate i18nTranslate : mapping) { query1.addScalar(i18nTranslate.column()); } - query.setParameter(1, id); - query.setParameter(2, language); + query.setParameter(1, language); List> result1 = query.getResultList(); - if (!result1.isEmpty()) { - result = result1.get(0); - cache.put(key, result); - } else - cache.put(key, new HashMap<>()); + result = new HashMap<>(); + for (Map map : result1) { + result.put(map.get(idColumn), map); + } + cache.put(key, result); } - return result; } diff --git a/src/main/java/org/ylhealth/ym/springtest/hibernate/I18NRepositoryFactoryBean.java b/src/main/java/org/ylhealth/ym/springtest/hibernate/I18NRepositoryFactoryBean.java index 2d270b4ff39a2bbd51121862eb5b0626a141c809..832b88059f663ee85f9ff5b92a43f2e499e0a439 100644 --- a/src/main/java/org/ylhealth/ym/springtest/hibernate/I18NRepositoryFactoryBean.java +++ b/src/main/java/org/ylhealth/ym/springtest/hibernate/I18NRepositoryFactoryBean.java @@ -9,6 +9,14 @@ import org.springframework.data.repository.core.RepositoryInformation; import org.springframework.data.repository.core.support.RepositoryFactorySupport; import org.springframework.data.repository.core.support.RepositoryProxyPostProcessor; +/** + * 將 Spring JPA 的讀取套上 i18n 轉換 + * @author scott.yang + * + * @param + * @param + * @param + */ public class I18NRepositoryFactoryBean, T, I extends Serializable> extends JpaRepositoryFactoryBean { diff --git a/src/main/java/org/ylhealth/ym/springtest/hibernate/I18NTranslates.java b/src/main/java/org/ylhealth/ym/springtest/hibernate/I18NTranslates.java index 4fd01f003a79fee33c10911c96f35d134d8fcf0b..56dc81b2658a5813addeb3ec4f3cd28588ea2fb4 100644 --- a/src/main/java/org/ylhealth/ym/springtest/hibernate/I18NTranslates.java +++ b/src/main/java/org/ylhealth/ym/springtest/hibernate/I18NTranslates.java @@ -9,7 +9,7 @@ import java.lang.annotation.Target; @Target({ElementType.TYPE}) public @interface I18NTranslates { /** - * 對應的 id + * 翻譯表格對應的資料 id 欄位 * * @return */ @@ -23,7 +23,7 @@ public @interface I18NTranslates { String table() default ""; /** - * 資料對應 + * 要翻譯的資料對應 */ I18NTranslate[] mapping(); }