Explorar el Código

git-svn-id: https://192.168.57.71/svn/hbghj@121 201dd7a2-ec1b-f84b-8b06-88221118ff88

ld_liufl hace 8 años
padre
commit
f25a70cbb8

+ 95 - 0
gkaq/yjpt-java/trunk/java_src/com/jtgh/cjhs/dao/common/CjhsCustomRepository.java

@@ -0,0 +1,95 @@
+package com.jtgh.cjhs.dao.common;
+
+import java.io.Serializable;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.Collections;
+import java.util.List;
+
+import javax.persistence.EntityManager;
+import javax.persistence.TypedQuery;
+
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageImpl;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.data.jpa.repository.query.QueryUtils;
+import org.springframework.data.jpa.repository.support.JpaEntityInformation;
+import org.springframework.data.jpa.repository.support.SimpleJpaRepository;
+import org.springframework.data.repository.NoRepositoryBean;
+
+import com.jtgh.cjhs.entity.CjhsBaseEntity;
+
+@NoRepositoryBean
+@SuppressWarnings("unchecked")
+public class CjhsCustomRepository<T  extends CjhsBaseEntity, ID extends Serializable>
+		extends SimpleJpaRepository<T, ID> implements CjhsRepository<T, ID> {
+	@SuppressWarnings("unused")
+	private final EntityManager entityManager;
+
+	@Override
+	public Page<T> findAll(Specification<T> spec, Pageable pageable) {
+		TypedQuery<T> query = null;
+		Method getCountQuery = null;
+		try {
+			Method queryMethod = SimpleJpaRepository.class.getDeclaredMethod(
+					"getQuery", Specification.class, Pageable.class);
+			getCountQuery = SimpleJpaRepository.class.getDeclaredMethod(
+					"getCountQuery", Specification.class);
+			queryMethod.setAccessible(true);
+			getCountQuery.setAccessible(true);
+			if (null != queryMethod) {
+				query = (TypedQuery<T>) queryMethod
+						.invoke(this, spec, pageable);
+			}
+			if (pageable == null) {
+				return new PageImpl<T>(query.getResultList());
+			}
+
+			query.setFirstResult(pageable.getOffset());
+			query.setMaxResults(pageable.getPageSize());
+			TypedQuery<Long> countQuery = null;
+			countQuery = (TypedQuery<Long>) getCountQuery.invoke(this, spec);
+			Long total = QueryUtils.executeCountQuery(countQuery);
+			List<T> content = null;
+			if (total > pageable.getOffset()) {
+				content = query.getResultList();
+			} else {
+				if (total == 0) {
+					content = Collections.<T> emptyList();
+				} else {
+					// 计算最后一页
+					long pages = total / pageable.getPageSize();
+					if (total % pageable.getPageSize() == 0) {
+						pages -= 1;
+					}
+					query.setFirstResult((int) pages * pageable.getPageSize());
+					content = query.getResultList();
+				}
+			}
+			return new PageImpl<T>(content, pageable, total);
+		} catch (IllegalArgumentException e) {
+			e.printStackTrace();
+		} catch (IllegalAccessException e) {
+			e.printStackTrace();
+		} catch (InvocationTargetException e) {
+			e.printStackTrace();
+		} catch (SecurityException e) {
+			e.printStackTrace();
+		} catch (NoSuchMethodException e) {
+			e.printStackTrace();
+		}
+		return null;
+	}
+
+	public CjhsCustomRepository(Class<T> domainClass, EntityManager em) {
+		super(domainClass, em);
+		this.entityManager = em;
+	}
+
+	public CjhsCustomRepository(JpaEntityInformation<T, ID> entityInformation,
+			EntityManager entityManager) {
+		super(entityInformation, entityManager);
+		this.entityManager = entityManager;
+	}
+}

+ 27 - 0
gkaq/yjpt-java/trunk/java_src/com/jtgh/cjhs/dao/common/CjhsRepository.java

@@ -0,0 +1,27 @@
+package com.jtgh.cjhs.dao.common;
+
+import java.io.Serializable;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+
+import com.jtgh.cjhs.entity.CjhsBaseEntity;
+
+/**
+ * Dao层共通基类<br>
+ * <p>
+ * 所有数据访问层(@Entity注解)继承此共通基类,实现数据访问层的共通处理。
+ * <p>
+ * 继承了{@link JpaRepository}接口,提供了大部分的数据CRUD处理,如果子类有特殊处理方法需要提供额外的接口
+ * <p>
+ * 在此处添加的接口方法所有Dao都可以使用,需要在CjhsCustomRepository实现方法
+ * 
+ * @param <E>
+ *            Dao所处理的Entity对象
+ * @param <PK>
+ *            Entity对象的主键类型,一般是{@link Long}
+ * @author 刘福亮
+ */
+public interface CjhsRepository<T extends CjhsBaseEntity , ID extends Serializable>
+		extends JpaRepository<T, ID>, JpaSpecificationExecutor<T> {
+}

+ 40 - 0
gkaq/yjpt-java/trunk/java_src/com/jtgh/cjhs/dao/common/CjhsRepositoryFactory.java

@@ -0,0 +1,40 @@
+package com.jtgh.cjhs.dao.common;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.io.Serializable;
+
+import javax.persistence.EntityManager;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.support.JpaEntityInformation;
+import org.springframework.data.jpa.repository.support.JpaRepositoryFactory;
+import org.springframework.data.repository.core.RepositoryMetadata;
+
+public class CjhsRepositoryFactory extends JpaRepositoryFactory {
+
+	public CjhsRepositoryFactory(EntityManager entityManager) {
+		super(entityManager);
+	}
+
+	@Override
+	protected Object getTargetRepository(RepositoryMetadata metadata) {
+		return super.getTargetRepository(metadata);
+	}
+
+	@SuppressWarnings({ "unchecked", "rawtypes" })
+	@Override
+	protected <T, ID extends Serializable> JpaRepository<?, ?> getTargetRepository(
+			RepositoryMetadata metadata, EntityManager entityManager) {
+		JpaEntityInformation<Object, Serializable> entityMetadata = mock(JpaEntityInformation.class);
+		when(entityMetadata.getJavaType()).thenReturn(
+				(Class<Object>) metadata.getDomainType());
+		return new CjhsCustomRepository(entityMetadata, entityManager);
+	}
+
+	@Override
+	protected Class<?> getRepositoryBaseClass(RepositoryMetadata metadata) {
+		return CjhsCustomRepository.class;
+	}
+}

+ 18 - 0
gkaq/yjpt-java/trunk/java_src/com/jtgh/cjhs/dao/common/CjhsRepositoryFactoryBean.java

@@ -0,0 +1,18 @@
+package com.jtgh.cjhs.dao.common;
+
+import java.io.Serializable;
+
+import javax.persistence.EntityManager;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean;
+import org.springframework.data.repository.core.support.RepositoryFactorySupport;
+
+public class CjhsRepositoryFactoryBean<T extends JpaRepository<Object, Serializable>>
+		extends JpaRepositoryFactoryBean<T, Object, Serializable> {
+	@Override
+	protected RepositoryFactorySupport createRepositoryFactory(
+			EntityManager entityManager) {
+		return new CjhsRepositoryFactory(entityManager);
+	}
+}

+ 0 - 18
gkaq/yjpt-java/trunk/java_src/com/jtgh/cjhs/entity/CjhsBaseEntity.java

@@ -1,18 +0,0 @@
-package com.jtgh.cjhs.entity;
-
-import java.io.Serializable;
-
-/**
- * 
- * @author 刘福亮
- *
- */
-public class CjhsBaseEntity implements Serializable{
-
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 8321030737539263252L;
-
-	
-}