diff --git a/src/main/java/org/ylhealth/ym/springtest/SpringTestApplication.java b/src/main/java/org/ylhealth/ym/springtest/SpringTestApplication.java index 8eac0e53e6d0c9328179a582f1c17ac1b96bb894..c9084b54c22da582aeef1f5576615284206719fb 100644 --- a/src/main/java/org/ylhealth/ym/springtest/SpringTestApplication.java +++ b/src/main/java/org/ylhealth/ym/springtest/SpringTestApplication.java @@ -3,13 +3,16 @@ package org.ylhealth.ym.springtest; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.AdviceMode; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import org.springframework.transaction.annotation.EnableTransactionManagement; +import org.ylhealth.ym.springtest.hibernate.I18NRepositoryFactoryBean; @SpringBootApplication -@EnableTransactionManagement(mode=AdviceMode.ASPECTJ) +@EnableTransactionManagement(mode = AdviceMode.ASPECTJ) +@EnableJpaRepositories(repositoryFactoryBeanClass = I18NRepositoryFactoryBean.class) public class SpringTestApplication { - public static void main(String[] args) { - SpringApplication.run(SpringTestApplication.class, args); - } + public static void main(String[] args) { + SpringApplication.run(SpringTestApplication.class, args); + } } diff --git a/src/main/java/org/ylhealth/ym/springtest/controller/I18NTestController.java b/src/main/java/org/ylhealth/ym/springtest/controller/I18NTestController.java index a0b42ee20ce4f1b29e0a5b94441d19412b584f7b..818bf7451c200d1210fe2e9e7fd788b196197fe0 100644 --- a/src/main/java/org/ylhealth/ym/springtest/controller/I18NTestController.java +++ b/src/main/java/org/ylhealth/ym/springtest/controller/I18NTestController.java @@ -1,6 +1,9 @@ package org.ylhealth.ym.springtest.controller; +import java.util.List; +import java.util.Locale; import javax.inject.Inject; +import org.springframework.context.i18n.LocaleContextHolder; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import org.ylhealth.ym.springtest.entity.CrmSystemL1basic; @@ -14,4 +17,17 @@ public class I18NTestController { public CrmSystemL1basic test1() { return dao.findOne("01"); } + @GetMapping("/i18n/Test11") + public List test11() { + return dao.findAll(); + } + @GetMapping("/i18n/Test2") + public CrmSystemL1basic test2() { + LocaleContextHolder.setLocale(Locale.SIMPLIFIED_CHINESE); + return dao.findOne("01"); + } + @GetMapping("/i18n/Test3") + public List test3() { + return dao.getAllCustom("01"); + } } diff --git a/src/main/java/org/ylhealth/ym/springtest/entity/CrmSystemL1basic.java b/src/main/java/org/ylhealth/ym/springtest/entity/CrmSystemL1basic.java index 6ef2bc56065e74e2abf09b1a99c6107d7b2f63c8..e1116dded1762b65f15ef205505339b53458c143 100644 --- a/src/main/java/org/ylhealth/ym/springtest/entity/CrmSystemL1basic.java +++ b/src/main/java/org/ylhealth/ym/springtest/entity/CrmSystemL1basic.java @@ -2,6 +2,7 @@ package org.ylhealth.ym.springtest.entity; // Generated Jul 20, 2016 5:22:20 PM by Hibernate Tools 3.2.2.GA import java.util.Date; +import javax.persistence.Cacheable; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; @@ -12,17 +13,22 @@ import javax.persistence.TemporalType; import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.Nationalized; import org.ylhealth.ym.springtest.hibernate.I18NTranslate; +import org.ylhealth.ym.springtest.hibernate.I18NTranslates; import com.fasterxml.jackson.annotation.JsonIgnore; /** CrmSystemL1basic generated by hbm2java */ @Entity @Table(name = "CRM_SystemL1Basic") +@Cacheable +@I18NTranslates( + id = "groupCode", + table = "CRM_SystemL1Basic_translation", + mapping = {@I18NTranslate(field = "groupName", column = "groupName")}) public class CrmSystemL1basic implements java.io.Serializable { private String groupCode; private String func; - - @I18NTranslate(column="groupName", id="groupCode", table = "CRM_SystemL1Basic_translation") + private String groupName; private Character codeStatus; private String status; diff --git a/src/main/java/org/ylhealth/ym/springtest/entity/CrmSystemL1basic2.java b/src/main/java/org/ylhealth/ym/springtest/entity/CrmSystemL1basic2.java new file mode 100644 index 0000000000000000000000000000000000000000..a1b66f0f29032900071fdec08e7c09f2741cb160 --- /dev/null +++ b/src/main/java/org/ylhealth/ym/springtest/entity/CrmSystemL1basic2.java @@ -0,0 +1,165 @@ +package org.ylhealth.ym.springtest.entity; +// Generated Jul 20, 2016 5:22:20 PM by Hibernate Tools 3.2.2.GA + +import java.util.Date; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.PrimaryKeyJoinColumn; +import javax.persistence.SecondaryTable; +import javax.persistence.SecondaryTables; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import org.hibernate.annotations.ColumnTransformer; +import org.hibernate.annotations.GenericGenerator; +import org.hibernate.annotations.Nationalized; +import com.fasterxml.jackson.annotation.JsonIgnore; + +/** CrmSystemL1basic generated by hbm2java */ +@Entity +@Table(name = "CRM_SystemL1Basic") +@SecondaryTables( + value = { + @SecondaryTable( + name = "CRM_SystemL1Basic_translation", + pkJoinColumns = {@PrimaryKeyJoinColumn(name = "GroupCode", referencedColumnName = "GroupCode")}) + }) +public class CrmSystemL1basic2 implements java.io.Serializable { + + private String groupCode; + private String func; + private String groupName; + private Character codeStatus; + private String status; + @JsonIgnore private String modifiedId; + @JsonIgnore private Date modifiedTime; + private Integer listSeq; + private String groupName1; + + public CrmSystemL1basic2() {} + + public CrmSystemL1basic2( + String groupCode, + String func, + String groupName, + String status, + String modifiedId, + Date modifiedTime) { + this.groupCode = groupCode; + this.func = func; + this.groupName = groupName; + this.status = status; + this.modifiedId = modifiedId; + this.modifiedTime = modifiedTime; + } + + public CrmSystemL1basic2( + String groupCode, + String func, + String groupName, + Character codeStatus, + String status, + String modifiedId, + Date modifiedTime, + Integer listSeq) { + this.groupCode = groupCode; + this.func = func; + this.groupName = groupName; + this.codeStatus = codeStatus; + this.status = status; + this.modifiedId = modifiedId; + this.modifiedTime = modifiedTime; + this.listSeq = listSeq; + } + + @Id + @GenericGenerator(name = "increment", strategy = "uuid2") + @GeneratedValue(generator = "increment") + @Column(name = "GroupCode", unique = true, nullable = false, length = 20) + public String getGroupCode() { + return this.groupCode; + } + + public void setGroupCode(String groupCode) { + this.groupCode = groupCode; + } + + @Column(name = "Func", nullable = false, length = 20) + public String getFunc() { + return this.func; + } + + public void setFunc(String func) { + this.func = func; + } + + @Nationalized + @Column(name = "GroupName", nullable = false, length = 50) + public String getGroupName() { + return this.groupName; + } + + public void setGroupName(String groupName) { + this.groupName = groupName; + } + + @Column(name = "CodeStatus", length = 1) + public Character getCodeStatus() { + return this.codeStatus; + } + + public void setCodeStatus(Character codeStatus) { + this.codeStatus = codeStatus; + } + + @Column(name = "Status", nullable = false, length = 1) + public String getStatus() { + return this.status; + } + + public void setStatus(String status) { + this.status = status; + } + + @Column(name = "ModifiedId", nullable = false, length = 20) + public String getModifiedId() { + return this.modifiedId; + } + + public void setModifiedId(String modifiedId) { + this.modifiedId = modifiedId; + } + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "ModifiedTime", nullable = false, length = 23) + public Date getModifiedTime() { + return this.modifiedTime; + } + + public void setModifiedTime(Date modifiedTime) { + this.modifiedTime = modifiedTime; + } + + @Column(name = "ListSeq") + public Integer getListSeq() { + return this.listSeq; + } + + public void setListSeq(Integer listSeq) { + this.listSeq = listSeq; + } + + @Column(name = "GroupName", table = "CRM_SystemL1Basic_translation") + @ColumnTransformer( + read = + "IsNull(CRM_SystemL1Basic_translation.GroupName, CRM_SystemL1Basic.GroupName)") + public String getGroupName1() { + return groupName1; + } + + public void setGroupName1(String groupName1) { + this.groupName1 = groupName1; + } +} diff --git a/src/main/java/org/ylhealth/ym/springtest/entity/UserInfo.java b/src/main/java/org/ylhealth/ym/springtest/entity/UserInfo.java index 0010dcee028957383869c46019b43d33ed714ea9..0bf330e6d477020e5a942f2c6bcb8d9910707cb7 100644 --- a/src/main/java/org/ylhealth/ym/springtest/entity/UserInfo.java +++ b/src/main/java/org/ylhealth/ym/springtest/entity/UserInfo.java @@ -14,6 +14,7 @@ public class UserInfo implements java.io.Serializable { private String id; private String name; + private String cname; public UserInfo() {} diff --git a/src/main/java/org/ylhealth/ym/springtest/hibernate/I18NInterceptor.java b/src/main/java/org/ylhealth/ym/springtest/hibernate/I18NInterceptor.java deleted file mode 100644 index 21fefdc431313ee7e493550e356ee6496bce6346..0000000000000000000000000000000000000000 --- a/src/main/java/org/ylhealth/ym/springtest/hibernate/I18NInterceptor.java +++ /dev/null @@ -1,40 +0,0 @@ -package org.ylhealth.ym.springtest.hibernate; - -import org.hibernate.boot.Metadata; -import org.hibernate.cfg.beanvalidation.DuplicationStrategyImpl; -import org.hibernate.engine.spi.SessionFactoryImplementor; -import org.hibernate.event.service.spi.EventListenerRegistry; -import org.hibernate.event.spi.EventType; -import org.hibernate.integrator.spi.Integrator; -import org.hibernate.service.spi.SessionFactoryServiceRegistry; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * 運用 org.hibernate.integrator.spi.Integrator 處理多國語系基本檔 - * 參考: - * https://github.com/deathman92/localized - */ -public class I18NInterceptor implements Integrator { - private Logger logger = LoggerFactory.getLogger(getClass()); - - @Override - public void integrate( - Metadata metadata, - SessionFactoryImplementor sessionFactory, - SessionFactoryServiceRegistry serviceRegistry) { - logger.debug("integrate..."); - - final EventListenerRegistry eventListenerRegistry = - serviceRegistry.getService(EventListenerRegistry.class); - eventListenerRegistry.addDuplicationStrategy(DuplicationStrategyImpl.INSTANCE); - eventListenerRegistry.appendListeners( - EventType.POST_LOAD, new I18NReadEventListener(sessionFactory)); - } - - @Override - public void disintegrate( - SessionFactoryImplementor sessionFactory, SessionFactoryServiceRegistry serviceRegistry) { - logger.debug("disintegrate..."); - } -} diff --git a/src/main/java/org/ylhealth/ym/springtest/hibernate/I18NPostProcessor.java b/src/main/java/org/ylhealth/ym/springtest/hibernate/I18NPostProcessor.java new file mode 100644 index 0000000000000000000000000000000000000000..53790f89000c149e5f0e8a647847c480733bd2af --- /dev/null +++ b/src/main/java/org/ylhealth/ym/springtest/hibernate/I18NPostProcessor.java @@ -0,0 +1,147 @@ +package org.ylhealth.ym.springtest.hibernate; + +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import javax.persistence.EntityManager; +import javax.persistence.Id; +import javax.persistence.Query; +import org.aopalliance.intercept.MethodInterceptor; +import org.aopalliance.intercept.MethodInvocation; +import org.hibernate.SQLQuery; +import org.hibernate.transform.Transformers; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.i18n.LocaleContextHolder; +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; + +/** + * Spring data 取出後進行多國語系的替換 + * + */ +public class I18NPostProcessor implements MethodInterceptor { + private Logger logger = LoggerFactory.getLogger(getClass()); + private EntityManager em; + + public I18NPostProcessor(EntityManager em) { + this.em = em; + } + + @SuppressWarnings("rawtypes") + private Cache cache = + CacheBuilder.newBuilder().expireAfterAccess(30, TimeUnit.MINUTES).build(); + + @Override + public Object invoke(MethodInvocation invocation) throws Throwable { + Object result = invocation.proceed(); + process(result); + return result; + } + + private void process(Object result) throws IllegalAccessException, InvocationTargetException { + if(result instanceof Collection) { + for (Object entity : (Collection)result) { + processEntity(entity); + } + } else { + processEntity(result); + } + } + + private void processEntity(Object entity) + throws IllegalAccessException, InvocationTargetException { + I18NTranslates i18n = entity.getClass().getAnnotation(I18NTranslates.class); + if (i18n != null) { + logger.trace("I18n process: {}", entity); + Class clazz = entity.getClass(); + Map translate = getTranslate(i18n, entity, clazz); + if (translate != null && !translate.isEmpty()) { + Field[] fields = clazz.getDeclaredFields(); + for (I18NTranslate i18nTranslate : i18n.mapping()) { + for (Field field : fields) { + if (field.getName().equals(i18nTranslate.field())) { + field.setAccessible(true); + field.set(entity, translate.get(i18nTranslate.column())); + break; + } + } + } + } + } + } + + /** + * + * @param i18n + * @param entity + * @param clazz + * @return + * @throws IllegalAccessException + * @throws InvocationTargetException + */ + private Map getTranslate(I18NTranslates i18n, Object entity, Class clazz) + throws IllegalAccessException, InvocationTargetException { + Object id = getPKValue(clazz, entity); + String language = LocaleContextHolder.getLocale().toString(); + String table = i18n.table(); + String idColumn = i18n.id(); + + String key = table + "_" + id + "_" + 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); + 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(i18nTranslate.column()); + } + query.setParameter(1, id); + query.setParameter(2, language); + List> result1 = query.getResultList(); + if (!result1.isEmpty()) { + result = result1.get(0); + cache.put(key, result); + } else + cache.put(key, new HashMap<>()); + } + + return result; + } + + private Object getPKValue(Class clazz, Object entity) + throws IllegalArgumentException, IllegalAccessException, InvocationTargetException { + Collection fields = getAllDeclaredFields(clazz); + for (Field field : fields) { + if (field.getAnnotation(Id.class) != null) { + field.setAccessible(true); + return field.get(entity); + } + } + for (Method method : clazz.getDeclaredMethods()) { + if (method.getAnnotation(Id.class) != null) { + return method.invoke(entity, null); + } + } + return null; + } + + private Collection getAllDeclaredFields(Class clazz) { + List fields = new ArrayList<>(); + Collections.addAll(fields, clazz.getDeclaredFields()); + if (clazz.getSuperclass() != null) { + fields.addAll(getAllDeclaredFields(clazz.getSuperclass())); + } + return fields; + } +} diff --git a/src/main/java/org/ylhealth/ym/springtest/hibernate/I18NReadEventListener.java b/src/main/java/org/ylhealth/ym/springtest/hibernate/I18NReadEventListener.java deleted file mode 100644 index dcde4586f6b68ac0d93648fb493c1059eef2fdb7..0000000000000000000000000000000000000000 --- a/src/main/java/org/ylhealth/ym/springtest/hibernate/I18NReadEventListener.java +++ /dev/null @@ -1,127 +0,0 @@ -package org.ylhealth.ym.springtest.hibernate; - -import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.concurrent.TimeUnit; -import javax.persistence.Id; -import org.hibernate.SQLQuery; -import org.hibernate.StatelessSession; -import org.hibernate.engine.spi.SessionFactoryImplementor; -import org.hibernate.event.spi.PostLoadEvent; -import org.hibernate.event.spi.PostLoadEventListener; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.context.i18n.LocaleContextHolder; -import com.google.common.cache.Cache; -import com.google.common.cache.CacheBuilder; - -/** */ -public class I18NReadEventListener implements PostLoadEventListener { - /** - * - */ - private static final long serialVersionUID = -7374424944903271183L; - - private Logger logger = LoggerFactory.getLogger(getClass()); - - private SessionFactoryImplementor sessionFactory; - @SuppressWarnings("rawtypes") - private Cache cache = - CacheBuilder.newBuilder().expireAfterAccess(30, TimeUnit.MINUTES).build(); - - public I18NReadEventListener(SessionFactoryImplementor sessionFactory) { - this.sessionFactory = sessionFactory; - } - - @SuppressWarnings("rawtypes") - @Override - public void onPostLoad(PostLoadEvent event) { - Object entity = event.getEntity(); - Class clazz = entity.getClass(); - Collection fields = getLocalizedFields(clazz); - if (!fields.isEmpty()) - try (StatelessSession session = - sessionFactory.openStatelessSession(event.getSession().connection())) { - - Object id = getPKValue(clazz, entity); - - String language = LocaleContextHolder.getLocale().toString(); - - for (Field field : fields) { - List result = getTranslate(session, id, field, language); - if (!result.isEmpty()) field.set(entity, result.get(0)); - } - } catch (Exception e) { - logger.error("ReadEventListener error", e); - throw new IllegalStateException(); - } - } - - private List getTranslate(StatelessSession session, Object id, Field field, String language) { - String key = field + "_" + id + "_" + language; - List result = cache.getIfPresent(key); - if (result == null) { - I18NTranslate localized = field.getAnnotation(I18NTranslate.class); - String sql = - String.format( - "select %s from %s where %s = ? and languageCode = ?", - localized.column(), localized.table(), localized.id()); - SQLQuery query = session.createSQLQuery(sql); - query.setParameter(0, id); - query.setParameter(1, language); - result = query.list(); - logger.info("SQL: {}: {}", sql, result); - cache.put(key, result); - } - return result; - } - - public static Object getPKValue(Class clazz, Object entity) - throws IllegalArgumentException, IllegalAccessException, InvocationTargetException { - Collection fields = getAllDeclaredFields(clazz); - for (Field field : fields) { - if (field.getAnnotation(Id.class) != null) { - field.setAccessible(true); - return field.get(entity); - } - } - for (Method method : clazz.getDeclaredMethods()) { - if (method.getAnnotation(Id.class) != null) { - return method.invoke(entity, null); - } - } - return null; - } - /** - * Returns the entity's @{@link I18NTranslate} fields. - * - *

These fields are made accessible. - */ - private static Collection getLocalizedFields(Class clazz) { - Collection fields = getAllDeclaredFields(clazz); - List localizedFields = new ArrayList<>(); - fields - .stream() - .filter(field -> field.getAnnotation(I18NTranslate.class) != null) - .forEach( - field -> { - field.setAccessible(true); - localizedFields.add(field); - }); - return localizedFields; - } - - private static Collection getAllDeclaredFields(Class clazz) { - List fields = new ArrayList<>(); - Collections.addAll(fields, clazz.getDeclaredFields()); - if (clazz.getSuperclass() != null) { - fields.addAll(getAllDeclaredFields(clazz.getSuperclass())); - } - return fields; - } -} diff --git a/src/main/java/org/ylhealth/ym/springtest/hibernate/I18NRepositoryFactoryBean.java b/src/main/java/org/ylhealth/ym/springtest/hibernate/I18NRepositoryFactoryBean.java new file mode 100644 index 0000000000000000000000000000000000000000..2d270b4ff39a2bbd51121862eb5b0626a141c809 --- /dev/null +++ b/src/main/java/org/ylhealth/ym/springtest/hibernate/I18NRepositoryFactoryBean.java @@ -0,0 +1,32 @@ +package org.ylhealth.ym.springtest.hibernate; + +import java.io.Serializable; +import javax.persistence.EntityManager; +import org.springframework.aop.framework.ProxyFactory; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean; +import org.springframework.data.repository.core.RepositoryInformation; +import org.springframework.data.repository.core.support.RepositoryFactorySupport; +import org.springframework.data.repository.core.support.RepositoryProxyPostProcessor; + +public class I18NRepositoryFactoryBean, T, I extends Serializable> + extends JpaRepositoryFactoryBean { + + public I18NRepositoryFactoryBean(Class repositoryInterface) { + super(repositoryInterface); + } + + @Override + protected RepositoryFactorySupport createRepositoryFactory(EntityManager em) { + RepositoryFactorySupport factory = super.createRepositoryFactory(em); + factory.addRepositoryProxyPostProcessor( + new RepositoryProxyPostProcessor() { + @Override + public void postProcess( + ProxyFactory factory, RepositoryInformation repositoryInformation) { + factory.addAdvice(new I18NPostProcessor(em)); + } + }); + return factory; + } +} diff --git a/src/main/java/org/ylhealth/ym/springtest/hibernate/I18NTranslate.java b/src/main/java/org/ylhealth/ym/springtest/hibernate/I18NTranslate.java index 49c7da61546340f7f7f0f116a392861f16f77e0b..bf96cf4a18867192a093e34c341a630740d87947 100644 --- a/src/main/java/org/ylhealth/ym/springtest/hibernate/I18NTranslate.java +++ b/src/main/java/org/ylhealth/ym/springtest/hibernate/I18NTranslate.java @@ -9,26 +9,17 @@ import java.lang.annotation.Target; * 利用 annotation 處理多國語系轉換 */ @Retention(RetentionPolicy.RUNTIME) -@Target({ElementType.FIELD}) +@Target({ElementType.TYPE}) public @interface I18NTranslate { /** - * 對應的欄位 + * class 的欄位 * @return */ - String column() default ""; - + String field(); /** - * 對應的 id - * @return - */ - String id() default ""; - - /** - * 翻譯的表格 + * 對應的欄位 * @return */ - String table() default ""; - - + String column() default ""; } diff --git a/src/main/java/org/ylhealth/ym/springtest/hibernate/I18NTranslates.java b/src/main/java/org/ylhealth/ym/springtest/hibernate/I18NTranslates.java new file mode 100644 index 0000000000000000000000000000000000000000..4fd01f003a79fee33c10911c96f35d134d8fcf0b --- /dev/null +++ b/src/main/java/org/ylhealth/ym/springtest/hibernate/I18NTranslates.java @@ -0,0 +1,29 @@ +package org.ylhealth.ym.springtest.hibernate; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.TYPE}) +public @interface I18NTranslates { + /** + * 對應的 id + * + * @return + */ + String id() default ""; + + /** + * 翻譯的表格 + * + * @return + */ + String table() default ""; + + /** + * 資料對應 + */ + I18NTranslate[] mapping(); +} diff --git a/src/main/java/org/ylhealth/ym/springtest/repo/CrmSystemL1basicRepo.java b/src/main/java/org/ylhealth/ym/springtest/repo/CrmSystemL1basicRepo.java index 1b53ffd743fbfef46ac32d254374efa8451657c6..73ade6a21c5ffe0bbef1f164e02d80ef1486d4db 100644 --- a/src/main/java/org/ylhealth/ym/springtest/repo/CrmSystemL1basicRepo.java +++ b/src/main/java/org/ylhealth/ym/springtest/repo/CrmSystemL1basicRepo.java @@ -3,4 +3,5 @@ package org.ylhealth.ym.springtest.repo; import org.springframework.data.jpa.repository.JpaRepository; import org.ylhealth.ym.springtest.entity.CrmSystemL1basic; -public interface CrmSystemL1basicRepo extends JpaRepository {} +public interface CrmSystemL1basicRepo + extends JpaRepository, CrmSystemL1basicRepoCustom {} diff --git a/src/main/java/org/ylhealth/ym/springtest/repo/CrmSystemL1basicRepoCustom.java b/src/main/java/org/ylhealth/ym/springtest/repo/CrmSystemL1basicRepoCustom.java new file mode 100644 index 0000000000000000000000000000000000000000..e2e3a633801468e869d57f58b22eed0b4f6c5d79 --- /dev/null +++ b/src/main/java/org/ylhealth/ym/springtest/repo/CrmSystemL1basicRepoCustom.java @@ -0,0 +1,8 @@ +package org.ylhealth.ym.springtest.repo; + +import java.util.List; +import org.ylhealth.ym.springtest.entity.CrmSystemL1basic; + +public interface CrmSystemL1basicRepoCustom { + public List getAllCustom(String id); +} diff --git a/src/main/java/org/ylhealth/ym/springtest/repo/CrmSystemL1basicRepoImpl.java b/src/main/java/org/ylhealth/ym/springtest/repo/CrmSystemL1basicRepoImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..a2c0401e74a904a11fe89fce5eb4352ec49ea459 --- /dev/null +++ b/src/main/java/org/ylhealth/ym/springtest/repo/CrmSystemL1basicRepoImpl.java @@ -0,0 +1,20 @@ +package org.ylhealth.ym.springtest.repo; + +import java.util.List; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import org.ylhealth.ym.springtest.entity.CrmSystemL1basic; + +public class CrmSystemL1basicRepoImpl implements CrmSystemL1basicRepoCustom { + @PersistenceContext private EntityManager em; + + @Override + public List getAllCustom(String id) { + List data = + em.createQuery("from CrmSystemL1basic where groupCode = :groupCode") + .setParameter("groupCode", id) + .setHint("org.hibernate.cacheable", "true") + .getResultList(); + return data; + } +} diff --git a/src/main/resources/META-INF/services/org.hibernate.integrator.spi.Integrator b/src/main/resources/META-INF/services/org.hibernate.integrator.spi.Integrator deleted file mode 100644 index 49ffa6f74cdda3b88651900f82e06cd5f9d0d69f..0000000000000000000000000000000000000000 --- a/src/main/resources/META-INF/services/org.hibernate.integrator.spi.Integrator +++ /dev/null @@ -1 +0,0 @@ -org.ylhealth.ym.springtest.hibernate.I18NInterceptor \ No newline at end of file