首页>代码>Spring4+Spring data Jpa整合+自定义Repository+Maven多模块(带例子、分页)项目实例>/hotel/hotel-sys/src/main/java/com/i5018/common/dao/impl/GenericRepositoryImpl.java
package com.i5018.common.dao.impl;

import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.io.Serializable;
import java.lang.reflect.Method;
import java.util.LinkedHashMap;

import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.EntityManager;
import javax.persistence.Query;

import org.apache.log4j.Logger;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.support.JpaEntityInformation;
import org.springframework.data.jpa.repository.support.JpaEntityInformationSupport;
import org.springframework.data.jpa.repository.support.SimpleJpaRepository;
import org.springframework.data.repository.NoRepositoryBean;

import com.i5018.common.dao.GenericRepository;
import com.i5018.common.util.QueryResult;

/**
 * {@link BasicJpaRepository}接口实现类,并在{@link SimpleJpaRepository}基础上扩展。
 * 
 * @author lmk
 *
 * @param <T>
 *            ORM对象
 * @param <ID>
 *            主键ID
 */
@NoRepositoryBean
// 必须的
public class GenericRepositoryImpl<T, ID extends Serializable> extends
		SimpleJpaRepository<T, ID> implements GenericRepository<T, ID> {

	static Logger logger = Logger.getLogger(GenericRepositoryImpl.class);
	private final EntityManager em;

	/**
	 * 构造函数
	 * 
	 * @param domainClass
	 * @param em
	 */
	public GenericRepositoryImpl(
			final JpaEntityInformation<T, ?> entityInformation,
			EntityManager entityManager) {

		super(entityInformation, entityManager);
		this.em = entityManager;
	}

	/**
	 * 构造函数
	 * 
	 * @param domainClass
	 * @param em
	 */
	public GenericRepositoryImpl(Class<T> domainClass, EntityManager em) {
		this(JpaEntityInformationSupport.getEntityInformation(domainClass, em),
				em);
	}

	@Override
	public void setQueryParams(Query query, Object[] queryParams) {

		if (null != queryParams && queryParams.length != 0) {
			for (int i = 0; i < queryParams.length; i++) {
				query.setParameter(i + 1, queryParams[i]);
			}
		}
	}

	@Override
	public String buildOrderby(LinkedHashMap<String, String> orderby) {
		StringBuffer orderbyql = new StringBuffer("");
		if (orderby != null && orderby.size() > 0) {
			orderbyql.append(" order by ");
			for (String key : orderby.keySet()) {
				orderbyql.append("o.").append(key).append(" ")
						.append(orderby.get(key)).append(",");
			}
			orderbyql.deleteCharAt(orderbyql.length() - 1);
		}
		return orderbyql.toString();
	}

	@Override
	public String getEntityName(Class<T> entityClass) {
		String entityname = entityClass.getSimpleName();
		Entity entity = entityClass.getAnnotation(Entity.class);
		if (entity.name() != null && !"".equals(entity.name())) {
			entityname = entity.name();
		}
		return entityname;
	}

	@Override
	public QueryResult<T> getScrollDataByJpql(Class<T> entityClass,
			String whereJpql, Object[] queryParams,
			LinkedHashMap<String, String> orderby, Pageable pageable) {

		QueryResult<T> qr = new QueryResult<T>();
		String entityname = getEntityName(entityClass);
		String sql = "select o from " + entityname + " o ";
		String sqlWhere = whereJpql == null ? "" : "where " + whereJpql;
		Query query = em.createQuery(sql + sqlWhere + buildOrderby(orderby));

		setQueryParams(query, queryParams);
		if (pageable.getPageNumber() != -1 && pageable.getPageSize() != -1)
			query.setFirstResult(
					pageable.getPageNumber() * pageable.getPageSize())
					.setMaxResults(pageable.getPageSize());
		qr.setResultList(query.getResultList());

		query = em.createQuery("select count(" + getCountField(entityClass)
				+ ") from " + entityname + " o " + sqlWhere);
		setQueryParams(query, queryParams);
		qr.setTotalRecord((Long) query.getSingleResult());

		return qr;
	}

	@Override
	public QueryResult<T> getScrollDataBySql(String sql, Object[] queryParams,
			Pageable pageable) {
		// 查询记录数
		QueryResult<T> qr = new QueryResult<T>();
		Query query = em.createNativeQuery(sql);
		setQueryParams(query, queryParams);
		if (pageable.getPageNumber() != -1 && pageable.getPageSize() != -1)
			query.setFirstResult(
					pageable.getPageNumber() * pageable.getPageSize())
					.setMaxResults(pageable.getPageSize());
		qr.setResultList(query.getResultList());

		//
		String from = getFromClause(sql);
		// 查询总记录数
		query = em.createQuery("select count(*) " + from);
		setQueryParams(query, queryParams);
		qr.setTotalRecord((Long) query.getSingleResult());
		return qr;
	}

	private String getCountField(Class<T> clazz) {

		String out = "o";
		try {
			PropertyDescriptor[] propertyDescriptors = Introspector
					.getBeanInfo(clazz).getPropertyDescriptors();
			for (PropertyDescriptor propertydesc : propertyDescriptors) {
				Method method = propertydesc.getReadMethod();
				if (method != null
						&& method.isAnnotationPresent(EmbeddedId.class)) {
					PropertyDescriptor[] ps = Introspector.getBeanInfo(
							propertydesc.getPropertyType())
							.getPropertyDescriptors();
					out = "o."
							+ propertydesc.getName()
							+ "."
							+ (!ps[1].getName().equals("class") ? ps[1]
									.getName() : ps[0].getName());
					break;
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return out;
	}

	/**
	 * 从sql中找出from子句
	 * 
	 * @param sql
	 * @return
	 */
	private String getFromClause(String sql) {
		String sql2 = sql.toLowerCase();
		int index = sql2.indexOf(" from ");
		if (index < 0) {
			return null;
		} else {
			int i1 = sql2.lastIndexOf(" order by ");
			int i2 = sql2.lastIndexOf(" group by ");

			if (i1 >= 0 && i2 >= 0) {
				return sql.substring(index, i1 > i2 ? i2 : i1);
			} else if (i1 >= 0) {
				return sql.substring(index, i1);
			} else if (i2 >= 0) {
				return sql.substring(index, i2);
			} else {
				return sql.substring(index);
			}
		}
	}

}
最近下载更多
lyw18271800260  LV10 2023年3月27日
人工智能4708  LV11 2022年3月13日
253702090  LV3 2021年8月15日
912299793  LV21 2020年10月12日
2410068425  LV23 2020年6月17日
氪氪超爱氪氪  LV10 2020年1月14日
huilenet  LV15 2019年12月31日
SumJFor  LV4 2019年12月31日
1211413075  LV14 2019年12月24日
ZHX_Lucien  LV3 2019年9月26日
最近浏览更多
lyw18271800260  LV10 2023年3月27日
werqjkl  LV5 2022年9月30日
testuser1234567  LV24 2022年5月23日
人工智能4708  LV11 2022年3月13日
fengshengtian  LV8 2022年2月25日
ZiruiSong  LV7 2022年1月4日
东方星空  LV1 2021年8月6日
OMITUUID  LV6 2021年7月7日
徐万强  LV9 2021年6月2日
860595563  LV15 2021年5月18日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友