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 1627b6d40d83cd03adb95f821883fb77038629b1..af63c6419285e53a1be9f6fcce193846195c4cec 100644 --- a/src/main/java/org/ylhealth/ym/springtest/hibernate/I18NPostProcessor.java +++ b/src/main/java/org/ylhealth/ym/springtest/hibernate/I18NPostProcessor.java @@ -23,10 +23,7 @@ import org.springframework.context.i18n.LocaleContextHolder; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; -/** - * Spring data 取出後進行多國語系的替換 - * 快取多語資料 30 分鐘 - */ +/** Spring data 取出後進行多國語系的替換 快取多語資料 30 分鐘 */ public class I18NPostProcessor implements MethodInterceptor { private Logger logger = LoggerFactory.getLogger(getClass()); private EntityManager em; @@ -45,19 +42,32 @@ public class I18NPostProcessor implements MethodInterceptor { process(result); return result; } - + + /** + * 處理查詢結果,如果是 Collection 的話,第一筆沒處理就不處理了 + * @param result + * @throws IllegalAccessException + * @throws InvocationTargetException + */ private void process(Object result) throws IllegalAccessException, InvocationTargetException { - if(result instanceof Collection) { - for (Object entity : (Collection)result) { - processEntity(entity); + if (result instanceof Collection) { + for (Object entity : (Collection) result) { + if (!processEntity(entity)) break; } } else { processEntity(result); } } - private void processEntity(Object entity) + /** + * @param entity + * @return 是否有處理 + * @throws IllegalAccessException + * @throws InvocationTargetException + */ + private boolean processEntity(Object entity) throws IllegalAccessException, InvocationTargetException { + boolean result = false; I18NTranslates i18n = entity.getClass().getAnnotation(I18NTranslates.class); if (i18n != null) { logger.trace("I18n process: {}", entity); @@ -75,11 +85,12 @@ public class I18NPostProcessor implements MethodInterceptor { } } } + result = true; } + return result; } /** - * * @param i18n * @param entity * @param clazz @@ -93,19 +104,20 @@ 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); + + Map> translateTable = + translateTable(table, language, i18n.mapping(), idColumn); return translateTable.get(id); } - - private Map> translateTable(String table, String language, I18NTranslate[] mapping, String idColumn) { + + 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 languageCode = ?", table); + String sql = 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);