Session Facade模式

SessionFacade模式并不是GOF经典设计模式之一,它是一种EJB Session Bean应用在J2ee架构中的一种相对比较好的实践

 

大家对DAO一定不陌生,我们通常用Dao维护单个对象的持久化。然后再从Dao之上加一个Facade设计模式,即为Service层。这里说的Session Facade模式也和这种模式类似,只是Dao换成了EAOEAO组件本身就是一种无状态的 Local EJB,它同样需要使用SessionBean作为其Facade,这个SessionBean可能是Local的也可以能是Remote的。

 

使用Session Facade模式的架构如下:

Session Facade模式_第1张图片

 

在我们现在做得项目中,这种模式的具体实现为:

Session Facade模式_第2张图片

 

 

ICommonEao规定了公共Eao的有方法,CommonEaoImpl是它的实现。

IBusinessEao是针对具体模块的Eao接口,它继承自公共Eao,同时又添加了自己特有的方法。

BusinessEaoImplIBusinessEao的具体实现,它必须继承CommonEaoImpl

 

 

整个项目中会有多个类似BusinessEaoImpl的组件,供上层SessionBean组合,来实现业务逻辑。上层SessionBean可看做外观层,可以是Remote的,也可以是Local的,依具体业务而定。

 

这里给出公共Eao的实现,其他的要根据自己的系统而定。

package ejb.common.eao;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;

import javax.ejb.Local;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;



import ejb.common.eao.ICommonEao;

/**
 * 操作数据库的基接口的实现类
 * 
 * @author 
 */
@Stateless(name = "common_EaoBean")
@Local
public class CommonEaoImpl implements ICommonEao {

	@PersistenceContext(unitName = "EjbPersistenceUnit")
	private EntityManager em;
    
	
	/**
	 * 查询不带参数的原生SQL
	 * 
	 * @param sql
	 *            原生SQL
	 * @return 记录
	 * @author 
	 */
	@SuppressWarnings("unchecked")
	@Override
	public <T> T getByNativeSQLQuery(String sql) {
		Query query = em.createNativeQuery(sql);
		T obj = null;
		List<T> listResult = (List<T>) query.getResultList();
		if (listResult.size() != 0) {
			obj = (T) listResult.get(0);
		}
		return obj;
	}

	/**
	 * 查询带参数的原生SQL
	 * 
	 * @param sql
	 *            原生SQL
	 * @param values
	 *            参数数组
	 * @return 记录
	 * @author 
	 */
	@SuppressWarnings("unchecked")
	@Override
	public <T> T getByNativeSQLQuery(String sql, Object[] values) {
		Query query = em.createNativeQuery(sql);
		T obj = null;
		if (values != null && values.length != 0) {
			for (int i = 0; i < values.length; i++) {
				query.setParameter(i + 1, values[i]);
			}
			List<T> listResult = (List<T>) query.getResultList();
			if (listResult.size() != 0) {
				obj = (T) listResult.get(0);
			}
		} else {
			List<T> listResult = (List<T>) query.getResultList();
			if (listResult.size() != 0) {
				obj = (T) listResult.get(0);
			}
		}
		return obj;
	}

	/**
	 * 查询不带参数的原生SQL,并且把查询的结果封装成实体
	 * 
	 * @param sql
	 *            原生SQL
	 * @param entityClass
	 *            实体
	 * @return 实体
	 * @author 
	 */
	@SuppressWarnings("unchecked")
	@Override
	public <T> T getByNativeSQLQuery(String sql, Class<T> entityClass) {
		Query query = em.createNativeQuery(sql, entityClass);
		T obj = null;
		List<T> listResult = (List<T>) query.getResultList();
		if (listResult.size() != 0) {
			obj = (T) listResult.get(0);
		}
		return obj;
	}

	/**
	 * 查询带参数的原生SQL,并且把查询的结果封装成实体
	 * 
	 * @param sql
	 *            原生SQL
	 * @param entityClass
	 *            实体
	 * @return 实体
	 * @author 
	 */
	@SuppressWarnings("unchecked")
	@Override
	public <T> T getByNativeSQLQuery(String sql, Object[] values,
			Class<T> entityClass) {
		Query query = em.createNativeQuery(sql, entityClass);
		T obj = null;
		if (values != null && values.length != 0) {
			for (int i = 0; i < values.length; i++) {
				query.setParameter(i + 1, values[i]);
			}
			List<T> listResult = (List<T>) query.getResultList();
			if (listResult.size() != 0) {
				obj = (T) listResult.get(0);
			}
		} else {
			List<T> listResult = (List<T>) query.getResultList();
			if (listResult.size() != 0) {
				obj = (T) listResult.get(0);
			}
		}
		return obj;
	}

	/**
	 * 查询不带参数的原生SQL
	 * 
	 * @param sql
	 *            原生SQL
	 * @return 记录集合
	 * @author 
	 */
	@SuppressWarnings("unchecked")
	@Override
	public <T> List<T> getResultListByNativeSQLQuery(String sql) {
		Query query = em.createNativeQuery(sql);
		List<T> listResult = (List<T>) query.getResultList();
		return listResult;
	}

	/**
	 * 查询带参数的原生SQL
	 * 
	 * @param sql
	 *            原生SQL
	 * @param values
	 *            参数数组
	 * @return 记录集合
	 * @author 
	 */
	@SuppressWarnings("unchecked")
	@Override
	public <T> List<T> getResultListByNativeSQLQuery(String sql, Object[] values) {
		Query query = em.createNativeQuery(sql);
		List<T> listResult = new ArrayList<T>();
		if (values != null && values.length != 0) {
			for (int i = 0; i < values.length; i++) {
				query.setParameter(i + 1, values[i]);
			}
			listResult = (List<T>) query.getResultList();
		} else {
			listResult = (List<T>) query.getResultList();

		}
		return listResult;
	}

	/**
	 * 查询不带参数的原生SQL,并且把查询的结果封装成实体
	 * 
	 * @param sql
	 *            原生SQL
	 * @param entityClass
	 *            实体
	 * @return 实体集合
	 * @author 
	 */
	@SuppressWarnings("unchecked")
	@Override
	public <T> List<T> getResultListByNativeSQLQuery(String sql,
			Class<T> entityClass) {
		Query query = em.createNativeQuery(sql, entityClass);
		List<T> listResult = (List<T>) query.getResultList();
		return listResult;
	}

	/**
	 * 查询带参数的原生SQL,并且把查询的结果封装成实体
	 * 
	 * @param sql
	 *            原生SQL
	 * @param entityClass
	 *            实体
	 * @return 实体集合
	 * @author 
	 */
	@SuppressWarnings("unchecked")
	@Override
	public <T> List<T> getResultListByNativeSQLQuery(String sql,
			Object[] values, Class<T> entityClass) {
		Query query = em.createNativeQuery(sql, entityClass);
		List<T> listResult = new ArrayList<T>();
		if (values != null && values.length != 0) {
			for (int i = 0; i < values.length; i++) {
				query.setParameter(i + 1, values[i]);
			}
			listResult = (List<T>) query.getResultList();
		} else {
			listResult = (List<T>) query.getResultList();
		}
		return listResult;
		
		
		
		
	}

	/*********************************************************************************************
	 * 
	 * 
	 * 上面是执行原型sql的接口实现,下面是执行QL的接口实现
	 * 
	 * 
	 *********************************************************************************************/

	/**
	 * 查找实体
	 * 
	 * @param entityClass
	 *            实体类
	 * @param pk
	 *            主键
	 * @return 根据指定主键返回实体
	 * @author 
	 */
	public <T> T get(Class<T> entityClass, Object pk) {
		T obj = em.find(entityClass, pk);
		return obj;
	}

	/**
	 * 根据相应的字段查询实体类
	 * 
	 * @param entityClass
	 *            实体类
	 * @param fields
	 *            相应的字段数组
	 * @param args
	 *            字段对应的值
	 * @return 根据相应字段返回的实体
	 * @author 
	 */
	@SuppressWarnings("unchecked")
	public <T> T get(Class<T> entityClass, Object[] fields, Object... args) {
		String entityName = entityClass.getSimpleName();
		Query query = em.createQuery("select o from " + entityName + " as o "
				+ buildWhereJpql(fields));
		for (int i = 0; i < args.length; i++) {
			query.setParameter(i + 1, args[i]);
		}
		List<T> listResult = (List<T>) query.getResultList();
		if (listResult.size() != 0) {
			T obj = (T) listResult.get(0);
			return obj;
		}
		return null;
	}

	/**
	 * 根据相应的字段查询实体类
	 * 
	 * @param entityClass
	 *            实体类
	 * @param fields
	 *            相应的字段数组
	 * @param args
	 *            字段对应的值
	 * @return 根据相应字段返回的实体
	 * @author 
	 */
	@SuppressWarnings("unchecked")
	public <T> T getByLike(Class<T> entityClass, Object[] fields,
			Object... args) {
		String entityName = entityClass.getSimpleName();
		Query query = em.createQuery("select o from " + entityName + " as o "
				+ buildWhereJpqlByLike(fields));
		for (int i = 0; i < args.length; i++) {
			query.setParameter(i + 1, args[i]);
		}
		List<T> listResult = (List<T>) query.getResultList();
		if (listResult.size() != 0) {
			T obj = (T) listResult.get(0);
			return obj;
		}
		return null;
	}

	/**
	 * 保存实体
	 * 
	 * @param entity
	 *            需要保存的实体
	 * @author 
	 */
	public void save(Object entity) {
		em.persist(entity);
	}

	/**
	 * 更新实体
	 * 
	 * @param entity
	 *            需要更新的实体
	 * @author 
	 */
	public void update(Object entity) {
		em.merge(entity);
	}

	/**
	 * 更新方法
	 * 
	 * @param entityClass
	 *            实体类
	 * @param setJpql
	 *            需要更新的字段,action传入的信息如下:o.name=?1 and o.password=?2
	 * @param whereJpql
	 *            where查询条件,比如:where o.name=?3 or o.password=?4 or o.desc=?5
	 * @param args
	 *            参数值 注意:参数值,其中对应需要更新的字段,以及where查询条件 
	 */
	public <T> void update(Class<T> entityClass, String setJpql,
			String whereJpql, Object... args) {
		String entityName = entityClass.getSimpleName();

		// System.out.println("update "+entityName+ " as o set "
		// +setJpql+" "+whereJpql);

		// 拼接的字符串类似
		// update User as o set o.name=1? where o.name=2?
		Query query = em.createQuery("update " + entityName + " as o set "
				+ setJpql + " " + whereJpql);

		for (int i = 0; i < args.length; i++) {
			query.setParameter(i + 1, args[i]);
		}

		query.executeUpdate();
	}

	/**
	 * 更新方法
	 * 
	 * @param entityClass
	 *            需要更新的实体类
	 * @param setFields
	 *            需要更新的字段数组,传入的信息如下:{name,id,functionId}
	 * @param whereFields
	 *            查询的条件数组, 传入的信息如下:{name,id,functionId}
	 * @param args
	 *            需要更新的字段数组和查询条件数组的参数值。 
	 */
	public <T> void update(Class<T> entityClass, Object[] setFields,
			Object[] whereFields, Object... args) {
		String entityName = entityClass.getSimpleName();
		System.out.println(entityName);
		System.out.println("update " + entityName + " as o  "
				+ buildsetWhereJpql(setFields, whereFields));
		Query query = em.createQuery("update " + entityName + " as o  "
				+ buildsetWhereJpql(setFields, whereFields));

		for (int i = 0; i < args.length; i++) {
			query.setParameter(i + 1, args[i]);
		}

		query.executeUpdate();
	}

	/**
	 * 删除实体
	 * 
	 * @param entityClass
	 *            需要删除的实体
	 * @param pk
	 *            需要删除的实体的主键
	 * @author 
	 */
	public void delete(Class<?> entityClass, Object pk) {
		em.remove(em.getReference(entityClass, pk));
	}

	/**
	 * 执行查询的方法
	 * 
	 * @param entityClass
	 *            实体类
	 * @param whereJpql
	 *            指定查询返回的第一条记录
	 * @param orderBy
	 *            用于排序,如果无须排序,该参数设为null,Map 对象的key为实体对象的字段名,value为ASC/DESC. 例如
	 *            LinkedHashMap<String,String> orderBy=new
	 *            LinkedHashMap<String,String>();
	 *            orderBy.put("itemName","DESC");表明根据itemName降序排列
	 *            如果放入多个key-value值,则第一次放入的为首要排序关键字,第二次放入的为次要关键字...
	 * @param args
	 *            作为JPQL查询字符串的参数值
	 * @return 返回查询得到的实体List
	 * @author 
	 */
	@SuppressWarnings("unchecked")
	public <T> List<T> getResultList(Class<T> entityClass, String whereJpql,
			LinkedHashMap<String, String> orderBy, Object... args) {
		String entityName = entityClass.getSimpleName();
		Query query = em.createQuery("select o from " + entityName + " as o "
				+ whereJpql + buildOrderby(orderBy));
		for (int i = 0; i < args.length; i++) {
			query.setParameter(i + 1, args[i]);
		}
		return (List<T>) query.getResultList();
	}

	/**
	 * 执行查询的方法
	 * 
	 * @param entityClass
	 *            实体类
	 * @param fields
	 *            指定查询条件的字段数组
	 * @param orderBy
	 *            用于排序,如果无须排序,该参数设为null,Map 对象的key为实体对象的字段名,value为ASC/DESC. 例如
	 *            LinkedHashMap<String,String> orderBy=new
	 *            LinkedHashMap<String,String>();
	 *            orderBy.put("itemName","DESC");表明根据itemName降序排列
	 *            如果放入多个key-value值,则第一次放入的为首要排序关键字,第二次放入的为次要关键字...
	 * @param args
	 *            作为JPQL查询字符串的参数值
	 * @return 返回查询得到的实体List
	 * @author 
	 */
	@SuppressWarnings("unchecked")
	public <T> List<T> getResultList(Class<T> entityClass, Object[] fields,
			LinkedHashMap<String, String> orderBy, Object... args) {
		String entityName = entityClass.getSimpleName();
		Query query = em.createQuery("select o from " + entityName + " as o "
				+ buildWhereJpql(fields) + buildOrderby(orderBy));
		for (int i = 0; i < args.length; i++) {
			query.setParameter(i + 1, args[i]);
		}
		return (List<T>) query.getResultList();
	}

	/**
	 * 执行查询的方法
	 * 
	 * @param entityClass
	 *            实体类
	 * @param whereJpql
	 *            指定查询返回的第一条记录
	 * @param firstResult
	 *            指定查询返回的第一条记录
	 * @param maxResult
	 *            设置查询最多返回多少条记录
	 * @param orderBy
	 *            用于排序,如果无须排序,该参数设为null,Map 对象的key为实体对象的字段名,value为ASC/DESC. 例如
	 *            LinkedHashMap<String,String> orderBy=new
	 *            LinkedHashMap<String,String>();
	 *            orderBy.put("itemName","DESC");表明根据itemName降序排列
	 *            如果放入多个key-value值,则第一次放入的为首要排序关键字,第二次放入的为次要关键字...
	 * @param args
	 *            作为JPQL查询字符串的参数值
	 * @return 返回查询得到的实体List
	 * @author 
	 */
	@SuppressWarnings("unchecked")
	public <T> List<T> getResultList(Class<T> entityClass, String whereJpql,
			int firstResult, int maxResult,
			LinkedHashMap<String, String> orderBy, Object... args) {
		String entityName = entityClass.getSimpleName();
		Query query = em.createQuery("select o from " + entityName + " as o "
				+ whereJpql + buildOrderby(orderBy));
		for (int i = 0; i < args.length; i++) {
			query.setParameter(i + 1, args[i]);
		}
		query.setMaxResults(maxResult).setFirstResult(firstResult);
		return (List<T>) query.getResultList();
	}

	/**
	 * 执行查询的方法
	 * 
	 * @param entityClass
	 *            实体类
	 * @param fields
	 *            指定查询条件的字段数组
	 * @param firstResult
	 *            指定查询返回的第一条记录
	 * @param maxResult
	 *            设置查询最多返回多少条记录
	 * @param orderBy
	 *            用于排序,如果无须排序,该参数设为null,Map 对象的key为实体对象的字段名,value为ASC/DESC. 例如
	 *            LinkedHashMap<String,String> orderBy=new
	 *            LinkedHashMap<String,String>();
	 *            orderBy.put("itemName","DESC");表明根据itemName降序排列
	 *            如果放入多个key-value值,则第一次放入的为首要排序关键字,第二次放入的为次要关键字...
	 * @param args
	 *            作为JPQL查询字符串的参数值
	 * @return 返回查询得到的实体List
	 * @author 
	 */
	@SuppressWarnings("unchecked")
	public <T> List<T> getResultList(Class<T> entityClass, Object[] fields,
			int firstResult, int maxResult,
			LinkedHashMap<String, String> orderBy, Object... args) {
		String entityName = entityClass.getSimpleName();
		Query query = em.createQuery("select o from " + entityName + " as o "
				+ buildWhereJpql(fields) + buildOrderby(orderBy));
		for (int i = 0; i < args.length; i++) {
			query.setParameter(i + 1, args[i]);
		}
		query.setMaxResults(maxResult).setFirstResult(firstResult);
		return (List<T>) query.getResultList();
	}

	/**
	 * 执行查询的方法
	 * 
	 * @param entityClass
	 *            实体类
	 * @param notNullfields
	 *            指定查询条件的不是空的字段数组
	 * @param nullFields
	 *            指定查询条件的是空的字段数组
	 * @param orderBy
	 *            用于排序,如果无须排序,该参数设为null,Map 对象的key为实体对象的字段名,value为ASC/DESC. 例如
	 *            LinkedHashMap<String,String> orderBy=new
	 *            LinkedHashMap<String,String>();
	 *            orderBy.put("itemName","DESC");表明根据itemName降序排列
	 *            如果放入多个key-value值,则第一次放入的为首要排序关键字,第二次放入的为次要关键字...
	 * @param args
	 *            作为JPQL查询字符串的参数值
	 * @return 返回查询得到的实体List
	 * @author 
	 */
	@SuppressWarnings("unchecked")
	@Override
	public <T> List<T> getResultList(Class<T> entityClass,
			Object[] notNullfields, Object[] nullFields,
			LinkedHashMap<String, String> orderBy, Object... notNullValues) {
		String entityName = entityClass.getSimpleName();
		Query query = em.createQuery("select o from "
				+ entityName
				+ " as o "
				+ buildWhereJpqlByEqualsAndOtherIsNull(notNullfields,
						nullFields) + buildOrderby(orderBy));
		for (int i = 0; i < notNullValues.length; i++) {
			query.setParameter(i + 1, notNullValues[i]);
		}
		return (List<T>) query.getResultList();
	}

	/**
	 * 执行查询的方法[插入相等和不等的参数进行查询]
	 * 
	 * @param entityClass
	 *            实体类
	 * @param equalFields
	 *            指定相等查询条件的字段数组
	 * @param notEqualFields
	 *            指定不相等查询条件的字段数组
	 * @param orderBy
	 *            用于排序,如果无须排序,该参数设为null,Map 对象的key为实体对象的字段名,value为ASC/DESC. 例如
	 *            LinkedHashMap<String,String> orderBy=new
	 *            LinkedHashMap<String,String>();
	 *            orderBy.put("itemName","DESC");表明根据itemName降序排列
	 *            如果放入多个key-value值,则第一次放入的为首要排序关键字,第二次放入的为次要关键字...
	 * @param equalValues
	 *            作为JPQL相等查询字符串的参数值
	 * @param notEqualValues
	 *            作为JPQL不等查询字符串的参数值
	 * @return 返回查询得到的实体List
	 * @author 
	 */
	@SuppressWarnings("unchecked")
	@Override
	public <T> List<T> getResultList(Class<T> entityClass,
			Object[] equalFields, Object[] notEqualFields,
			LinkedHashMap<String, String> orderBy, Object[] equalValues,
			Object... notEqualValues) {
		String entityName = entityClass.getSimpleName();
		Query query = em.createQuery("select o from "
				+ entityName
				+ " as o "
				+ buildWhereJpqlByEqualsAndOtherNotEquals(equalFields,
						notEqualFields) + buildOrderby(orderBy));
		for (int i = 0; i < equalFields.length; i++) {
			query.setParameter(i + 1, equalValues[i]);
		}
		for (int i = 0; i < notEqualFields.length; i++) {
			query.setParameter(i + 1 + equalFields.length, notEqualValues[i]);
		}
		return (List<T>) query.getResultList();
	}

	/**
	 * 执行查询的方法[传入模糊查询和不相等的参数值来查询]
	 * 
	 * @param entityClass
	 *            实体类
	 * @param likeFields
	 *            指定模糊查询条件的字段数组
	 * @param notEqualFields
	 *            指定不相等查询条件的字段数组
	 * @param orderBy
	 *            用于排序,如果无须排序,该参数设为null,Map 对象的key为实体对象的字段名,value为ASC/DESC. 例如
	 *            LinkedHashMap<String,String> orderBy=new
	 *            LinkedHashMap<String,String>();
	 *            orderBy.put("itemName","DESC");表明根据itemName降序排列
	 *            如果放入多个key-value值,则第一次放入的为首要排序关键字,第二次放入的为次要关键字...
	 * @param likeValues
	 *            作为JPQL模糊查询字符串的参数值
	 * @param notEqualValues
	 *            作为JPQL不等查询字符串的参数值
	 * @return 返回查询得到的实体List
	 * @author 
	 */
	@SuppressWarnings("unchecked")
	@Override
	public <T> List<T> getResultListByLike(Class<T> entityClass,
			Object[] likeFields, Object[] notEqualFields,
			LinkedHashMap<String, String> orderBy, Object[] likeValues,
			Object... notEqualValues) {
		String entityName = entityClass.getSimpleName();
		Query query = em.createQuery("select o from "
				+ entityName
				+ " as o "
				+ buildWhereJpqlByLikeAndOtherNotEquals(likeFields,
						notEqualFields) + buildOrderby(orderBy));
		for (int i = 0; i < likeFields.length; i++) {
			query.setParameter(i + 1, likeValues[i]);
		}
		for (int i = 0; i < notEqualFields.length; i++) {
			query.setParameter(i + 1 + likeFields.length, notEqualValues[i]);
		}
		return (List<T>) query.getResultList();
	}

	/**
	 * 执行查询的方法[插入相等和不等的参数进行查询]
	 * 
	 * @param entityClass
	 *            实体类
	 * @param equalFields
	 *            指定相等查询条件的字段数组
	 * @param notEqualFields
	 *            指定不相等查询条件的字段数组
	 * @param firstResult
	 *            指定查询返回的第一条记录
	 * @param maxResult
	 *            设置查询最多返回多少条记录
	 * @param orderBy
	 *            用于排序,如果无须排序,该参数设为null,Map 对象的key为实体对象的字段名,value为ASC/DESC. 例如
	 *            LinkedHashMap<String,String> orderBy=new
	 *            LinkedHashMap<String,String>();
	 *            orderBy.put("itemName","DESC");表明根据itemName降序排列
	 *            如果放入多个key-value值,则第一次放入的为首要排序关键字,第二次放入的为次要关键字...
	 * @param equalValues
	 *            作为JPQL相等查询字符串的参数值
	 * @param notEqualValues
	 *            作为JPQL不等查询字符串的参数值
	 * @return 返回查询得到的实体List
	 * @author 
	 */
	@SuppressWarnings("unchecked")
	@Override
	public <T> List<T> getResultList(Class<T> entityClass,
			Object[] equalFields, Object[] notEqualFields, int firstResult,
			int maxResult, LinkedHashMap<String, String> orderBy,
			Object[] equalValues, Object... notEqualValues) {
		String entityName = entityClass.getSimpleName();
		Query query = em.createQuery("select o from "
				+ entityName
				+ " as o "
				+ buildWhereJpqlByEqualsAndOtherNotEquals(equalFields,
						notEqualFields) + buildOrderby(orderBy));
		for (int i = 0; i < equalFields.length; i++) {
			query.setParameter(i + 1, equalValues[i]);
		}
		for (int i = 0; i < notEqualFields.length; i++) {
			query.setParameter(i + 1 + equalFields.length, notEqualValues[i]);
		}
		query.setMaxResults(maxResult).setFirstResult(firstResult);
		return (List<T>) query.getResultList();
	}

	/**
	 * 执行查询的方法[传入模糊查询和不相等的参数值来查询]
	 * 
	 * @param entityClass
	 *            实体类
	 * @param likeFields
	 *            指定模糊查询条件的字段数组
	 * @param notEqualFields
	 *            指定不相等查询条件的字段数组
	 * @param firstResult
	 *            指定查询返回的第一条记录
	 * @param maxResult
	 *            设置查询最多返回多少条记录
	 * @param orderBy
	 *            用于排序,如果无须排序,该参数设为null,Map 对象的key为实体对象的字段名,value为ASC/DESC. 例如
	 *            LinkedHashMap<String,String> orderBy=new
	 *            LinkedHashMap<String,String>();
	 *            orderBy.put("itemName","DESC");表明根据itemName降序排列
	 *            如果放入多个key-value值,则第一次放入的为首要排序关键字,第二次放入的为次要关键字...
	 * @param likeValues
	 *            作为JPQL模糊查询字符串的参数值
	 * @param notEqualValues
	 *            作为JPQL不等查询字符串的参数值
	 * @return 返回查询得到的实体List
	 * @author 
	 */
	@SuppressWarnings("unchecked")
	@Override
	public <T> List<T> getResultListByLike(Class<T> entityClass,
			Object[] likeFields, Object[] notEqualFields, int firstResult,
			int maxResult, LinkedHashMap<String, String> orderBy,
			Object[] likeValues, Object... notEqualValues) {
		String entityName = entityClass.getSimpleName();
		Query query = em.createQuery("select o from "
				+ entityName
				+ " as o "
				+ buildWhereJpqlByLikeAndOtherNotEquals(likeFields,
						notEqualFields) + buildOrderby(orderBy));
		for (int i = 0; i < likeFields.length; i++) {
			query.setParameter(i + 1, likeValues[i]);
		}
		for (int i = 0; i < notEqualFields.length; i++) {
			query.setParameter(i + 1 + likeFields.length, notEqualValues[i]);
		}
		query.setMaxResults(maxResult).setFirstResult(firstResult);
		return (List<T>) query.getResultList();
	}

	/**
	 * 执行查询的方法
	 * 
	 * @param entityClass
	 *            实体类
	 * @param fields
	 *            指定模糊查询条件的字段数组
	 * @param orderBy
	 *            用于排序,如果无须排序,该参数设为null,Map 对象的key为实体对象的字段名,value为ASC/DESC. 例如
	 *            LinkedHashMap<String,String> orderBy=new
	 *            LinkedHashMap<String,String>();
	 *            orderBy.put("itemName","DESC");表明根据itemName降序排列
	 *            如果放入多个key-value值,则第一次放入的为首要排序关键字,第二次放入的为次要关键字...
	 * @param args
	 *            作为JPQL查询字符串的参数值
	 * @return 返回查询得到的实体List
	 * @author 
	 */
	@SuppressWarnings("unchecked")
	public <T> List<T> getResultListByLike(Class<T> entityClass,
			Object[] fields, LinkedHashMap<String, String> orderBy,
			Object... args) {
		String entityName = entityClass.getSimpleName();
		Query query = em.createQuery("select o from " + entityName + " as o "
				+ buildWhereJpqlByLike(fields) + buildOrderby(orderBy));
		for (int i = 0; i < args.length; i++) {
			query.setParameter(i + 1, args[i]);
		}
		return (List<T>) query.getResultList();
	}

	/**
	 * 执行查询的方法
	 * 
	 * @param entityClass
	 *            实体类
	 * @param fields
	 *            指定模糊查询条件的字段数组
	 * @param firstResult
	 *            指定查询返回的第一条记录
	 * @param maxResult
	 *            设置查询最多返回多少条记录
	 * @param orderBy
	 *            用于排序,如果无须排序,该参数设为null,Map 对象的key为实体对象的字段名,value为ASC/DESC. 例如
	 *            LinkedHashMap<String,String> orderBy=new
	 *            LinkedHashMap<String,String>();
	 *            orderBy.put("itemName","DESC");表明根据itemName降序排列
	 *            如果放入多个key-value值,则第一次放入的为首要排序关键字,第二次放入的为次要关键字...
	 * @param args
	 *            作为JPQL查询字符串的参数值
	 * @return 返回查询得到的实体List
	 * @author
	 */
	@SuppressWarnings("unchecked")
	public <T> List<T> getResultListByLike(Class<T> entityClass,
			Object[] fields, int firstResult, int maxResult,
			LinkedHashMap<String, String> orderBy, Object... args) {
		String entityName = entityClass.getSimpleName();
		Query query = em.createQuery("select o from " + entityName + " as o "
				+ buildWhereJpqlByLike(fields) + buildOrderby(orderBy));
		for (int i = 0; i < args.length; i++) {
			query.setParameter(i + 1, args[i]);
		}
		query.setMaxResults(maxResult).setFirstResult(firstResult);
		return (List<T>) query.getResultList();
	}

	/**
	 * 执行查询的方法
	 * 
	 * @param entityClass
	 *            实体类
	 * @param likeFields
	 *            指定模糊查询条件的字段数组
	 * @param equalFields
	 *            指定相等的查询条件的字段数组
	 * @param firstResult
	 *            指定查询返回的第一条记录
	 * @param maxResult
	 *            设置查询最多返回多少条记录
	 * @param orderBy
	 *            用于排序,如果无须排序,该参数设为null,Map 对象的key为实体对象的字段名,value为ASC/DESC. 例如
	 *            LinkedHashMap<String,String> orderBy=new
	 *            LinkedHashMap<String,String>();
	 *            orderBy.put("itemName","DESC");表明根据itemName降序排列
	 *            如果放入多个key-value值,则第一次放入的为首要排序关键字,第二次放入的为次要关键字...
	 * @param equalValues
	 *            作为JPQL查询字符串的相等的参数值
	 * @param likeValues
	 *            作为JPQL查询字符串的模糊参数值
	 * @return 返回查询得到的实体List
	 * @author 
	 */
	@SuppressWarnings("unchecked")
	@Override
	public <T> List<T> getResultListByLikeAndEquals(Class<T> entityClass,
			Object[] likeFields, Object[] equalFields, int firstResult,
			int maxResult, LinkedHashMap<String, String> orderBy,
			Object[] equalValues, Object... likeValues) {
		String entityName = entityClass.getSimpleName();
		Query query = em.createQuery("select o from " + entityName + " as o "
				+ buildWhereJpqlByLikeAndEqual(likeFields, equalFields)
				+ buildOrderby(orderBy));
		for (int i = 0; i < likeValues.length; i++) {
			query.setParameter(i + 1, likeValues[i]);
		}
		for (int i = 0; i < equalValues.length; i++) {
			query.setParameter(i + 1 + likeValues.length, equalValues[i]);
		}
		query.setMaxResults(maxResult).setFirstResult(firstResult);
		return (List<T>) query.getResultList();
	}

	/**
	 * 执行查询的方法[用于判断某些具体参数是不是null的情况]
	 * 
	 * @param entityClass
	 *            实体类
	 * @param likeFields
	 *            指定模糊查询条件的字段数组
	 * @param equalFields
	 *            指定相等的查询条件的字段数组
	 * @param firstResult
	 *            指定查询返回的第一条记录
	 * @param maxResult
	 *            设置查询最多返回多少条记录
	 * @param orderBy
	 *            用于排序,如果无须排序,该参数设为null,Map 对象的key为实体对象的字段名,value为ASC/DESC. 例如
	 *            LinkedHashMap<String,String> orderBy=new
	 *            LinkedHashMap<String,String>();
	 *            orderBy.put("itemName","DESC");表明根据itemName降序排列
	 *            如果放入多个key-value值,则第一次放入的为首要排序关键字,第二次放入的为次要关键字...
	 * @param equalValues
	 *            作为JPQL查询字符串的相等的参数值
	 * @param likeValues
	 *            作为JPQL查询字符串的模糊参数值
	 * @return 返回查询得到的实体List
	 * @author 
	 */
	@SuppressWarnings("unchecked")
	@Override
	public <T> List<T> getResultListByLikeAndEquals(Class<T> entityClass,
			Object[] likeFields, Object[] equalFields, int firstResult,
			int maxResult, LinkedHashMap<String, String> orderBy,
			Object... likeValues) {
		String entityName = entityClass.getSimpleName();
		Query query = em.createQuery("select o from " + entityName + " as o "
				+ buildWhereJpqlByLikeAndEqualsIsNull(likeFields, equalFields)
				+ buildOrderby(orderBy));
		for (int i = 0; i < likeValues.length; i++) {
			query.setParameter(i + 1, likeValues[i]);
		}
		query.setMaxResults(maxResult).setFirstResult(firstResult);
		return (List<T>) query.getResultList();
	}

	/**
	 * 将hashmap中的数据拼成字符串
	 * 
	 * @param orderBy
	 *            LinkedHashMap对象,每个key-value为一个排序的条件
	 * @return 排序条件字符串
	 * @author 
	 */
	private String buildOrderby(LinkedHashMap<String, String> orderBy) {
		StringBuffer out = new StringBuffer("");
		if (orderBy != null && orderBy.size() > 0) {
			out.append(" order by ");
			for (String key : orderBy.keySet()) {
				out.append("o." + key + " " + orderBy.get(key));
				out.append(",");
			}
			out.deleteCharAt(out.length() - 1);
		}
		return out.toString();
	}

	/**
	 * 拼接查询字符串
	 * 
	 * @param fields
	 *            相应的字段数组
	 * @return 拼接查询的字符串
	 * @author 
	 */
	private String buildWhereJpql(Object[] fields) {
		StringBuffer out = new StringBuffer("");
		if (fields != null && fields.length > 0) {
			out.append(" where ");
			for (int index = 0; index < fields.length; index++) {
				out.append(" o." + fields[index] + "=?" + (index + 1) + " ");
				out.append("and");
			}
			out.delete(out.length() - 3, out.length());
		}
		return out.toString();
	}

	/**
	 * 拼接查询字符串[用于判断所传入的值是否为null]
	 * 
	 * @param fields
	 *            相应的字段数组
	 * @return 拼接查询的字符串
	 * @author 
	 */
	private String buildWhereJpqlIsNull(Object[] fields) {
		StringBuffer out = new StringBuffer("");
		if (fields != null && fields.length > 0) {
			out.append(" where ");
			for (int index = 0; index < fields.length; index++) {
				out.append(" o." + fields[index] + " is null ");
				out.append("and");
			}
			out.delete(out.length() - 3, out.length());
		}
		return out.toString();
	}

	/**
	 * 拼接set字段和where字段的hql语句
	 * 
	 * @param fields1
	 *            set字段
	 * @param fields2
	 *            where字段
	 * @return 
	 */
	private String buildsetWhereJpql(Object[] fields1, Object[] fields2) {

		StringBuffer out = new StringBuffer("");
		if (fields1 != null && fields1.length > 0) {
			out.append(" set ");
			for (int index = 0; index < fields1.length; index++) {
				out.append(" o." + fields1[index] + "=?" + (index + 1) + " ");
				out.append("and");
			}
			out.delete(out.length() - 3, out.length());

			out.append(" where ");
			for (int index = 0; index < (fields2.length); index++) {
				out.append(" o." + fields2[index] + "=?"
						+ (fields1.length + (index + 1)) + " ");
				out.append("and");
			}
			out.delete(out.length() - 3, out.length());
		}

		return out.toString();
	}

	/**
	 * 拼接查询字符串
	 * 
	 * @param fields
	 *            相应的字段数组
	 * @return 拼接查询的字符串
	 * @author 
	 */
	private String buildWhereJpqlByLike(Object[] fields) {
		StringBuffer out = new StringBuffer("");
		if (fields != null && fields.length > 0) {
			out.append(" where ");
			for (int index = 0; index < fields.length; index++) {
				out.append(" o." + fields[index] + " like ?" + (index + 1)
						+ " ");
				out.append("and");
			}
			out.delete(out.length() - 3, out.length());
		}
		return out.toString();
	}

	/**
	 * 拼接查询字符串
	 * 
	 * @param notEquals
	 *            相应的字段数组
	 * @return 拼接查询的字符串
	 * @author 
	 */
	private String buildWhereJpqlNotEqual(Object[] notEquals) {
		StringBuffer out = new StringBuffer("");
		if (notEquals != null && notEquals.length > 0) {
			out.append(" where ");
			for (int index = 0; index < notEquals.length; index++) {
				out.append(" o." + notEquals[index] + "<>?" + (index + 1) + " ");
				out.append("and");
			}
			out.delete(out.length() - 3, out.length());
		}
		return out.toString();
	}

	/**
	 * 拼接查询字符串[用于判断某些参数相似有些参数不等情况]
	 * 
	 * @param likeFields
	 *            模糊字段数组
	 * @param notEqualFields
	 *            不具体字段数组
	 * @return 拼接查询的字符串
	 * @author 
	 */
	private String buildWhereJpqlByLikeAndOtherNotEquals(Object[] likeFields,
			Object[] notEqualFields) {
		String result = "";
		if ((likeFields != null && likeFields.length > 0)
				&& (notEqualFields == null || notEqualFields.length == 0)) {
			result = buildWhereJpqlByLike(likeFields);
		} else if ((likeFields == null || likeFields.length == 0)
				&& (notEqualFields != null && notEqualFields.length > 0)) {
			result = buildWhereJpqlNotEqual(notEqualFields);
		} else if ((likeFields == null || likeFields.length == 0)
				&& (notEqualFields == null || notEqualFields.length == 0)) {
			result = "";
		} else {
			StringBuffer out = new StringBuffer("");
			out.append(" where ");
			for (int index = 0; index < likeFields.length; index++) {
				out.append(" o." + likeFields[index] + " like ?" + (index + 1)
						+ " ");
				out.append("and");
			}
			for (int index = 0; index < notEqualFields.length; index++) {
				out.append(" o." + notEqualFields[index] + " <> ?"
						+ (index + 1 + likeFields.length) + " ");
				out.append("and");
			}
			out.delete(out.length() - 3, out.length());
			result = out.toString();

		}

		return result;
	}

	/**
	 * 拼接查询字符串[用于判断某些参数相等有些参数不想等的情况]
	 * 
	 * @param equalFields
	 *            相等字段数组
	 * @param notEqualFields
	 *            不相等字段数组
	 * @return 拼接查询的字符串
	 * @author 
	 */
	private String buildWhereJpqlByEqualsAndOtherNotEquals(
			Object[] equalFields, Object[] notEqualFields) {
		String result = "";
		if ((equalFields != null && equalFields.length > 0)
				&& (notEqualFields == null || notEqualFields.length == 0)) {
			result = buildWhereJpql(equalFields);
		} else if ((equalFields == null || equalFields.length == 0)
				&& (notEqualFields != null && notEqualFields.length > 0)) {
			result = buildWhereJpqlNotEqual(notEqualFields);
		} else if ((equalFields == null || equalFields.length == 0)
				&& (notEqualFields == null || notEqualFields.length == 0)) {
			result = "";
		} else {
			StringBuffer out = new StringBuffer("");
			out.append(" where ");
			for (int index = 0; index < equalFields.length; index++) {
				out.append(" o." + equalFields[index] + " = ?" + (index + 1)
						+ " ");
				out.append("and");
			}
			for (int index = 0; index < notEqualFields.length; index++) {
				out.append(" o." + notEqualFields[index] + " <> ?"
						+ (index + 1 + equalFields.length) + " ");
				out.append("and");
			}
			out.delete(out.length() - 3, out.length());
			result = out.toString();

		}

		return result;
	}

	/**
	 * 拼接查询字符串[用于判断某些具体参数是不是null的情况]
	 * 
	 * @param likeFields
	 *            模糊字段数组
	 * @param equalFields
	 *            具体字段数组
	 * @return 拼接查询的字符串
	 * @author 
	 */
	private String buildWhereJpqlByLikeAndEqualsIsNull(Object[] likeFields,
			Object[] equalFields) {
		String result = "";
		if ((likeFields != null && likeFields.length > 0)
				&& (equalFields == null || equalFields.length == 0)) {
			result = buildWhereJpqlByLike(likeFields);
		} else if ((likeFields == null || likeFields.length == 0)
				&& (equalFields != null && equalFields.length > 0)) {
			result = buildWhereJpqlIsNull(equalFields);
		} else if ((equalFields == null || equalFields.length == 0)
				&& (likeFields == null || likeFields.length == 0)) {
			result = "";
		} else {
			StringBuffer out = new StringBuffer("");
			out.append(" where ");
			for (int index = 0; index < likeFields.length; index++) {
				out.append(" o." + likeFields[index] + " like ?" + (index + 1)
						+ " ");
				out.append("and");
			}
			for (int index = 0; index < equalFields.length; index++) {
				out.append(" o." + equalFields[index] + " is null ");
				out.append("and");
			}
			out.delete(out.length() - 3, out.length());
			result = out.toString();
		}

		return result;
	}

	/**
	 * 拼接查询字符串[某些参数不为null,某些参数为null的情况]
	 * 
	 * @param notNullfields
	 *            不为空的字段数组
	 * 
	 * @param nullFields
	 *            为空的字段数组
	 * @return 拼接查询的字符串
	 * @author 
	 */
	private String buildWhereJpqlByEqualsAndOtherIsNull(Object[] notNullfields,
			Object[] nullFields) {
		String result = "";
		if ((notNullfields != null && notNullfields.length > 0)
				&& (nullFields == null || nullFields.length == 0)) {
			result = buildWhereJpql(notNullfields);
		} else if ((notNullfields == null || notNullfields.length == 0)
				&& (nullFields != null && nullFields.length > 0)) {
			result = buildWhereJpqlIsNull(nullFields);
		} else if ((notNullfields == null || notNullfields.length == 0)
				&& (nullFields == null || nullFields.length == 0)) {
			result = "";
		} else {
			StringBuffer out = new StringBuffer("");
			out.append(" where ");
			for (int index = 0; index < notNullfields.length; index++) {
				out.append(" o." + notNullfields[index] + "=?" + (index + 1)
						+ " ");
				out.append("and");
			}
			for (int index = 0; index < nullFields.length; index++) {
				out.append(" o." + nullFields[index] + " is null ");
				out.append("and");
			}
			out.delete(out.length() - 3, out.length());
			result = out.toString();
		}

		return result;
	}

	/**
	 * 拼接查询字符串
	 * 
	 * @param fields
	 *            相应的字段数组
	 * @return 拼接查询的字符串
	 * @author 
	 */
	private String buildWhereJpqlByLikeAndEqual(Object[] likeFields,
			Object[] equalFields) {
		String result = "";
		if ((likeFields != null && likeFields.length > 0)
				&& (equalFields == null || equalFields.length == 0)) {
			result = buildWhereJpqlByLike(likeFields);
		} else if ((likeFields == null || likeFields.length == 0)
				&& (equalFields != null && equalFields.length > 0)) {
			result = buildWhereJpql(equalFields);
		} else if ((equalFields == null || equalFields.length == 0)
				&& (likeFields == null || likeFields.length == 0)) {
			result = "";
		} else {
			StringBuffer out = new StringBuffer("");
			out.append(" where ");
			for (int index = 0; index < likeFields.length; index++) {
				out.append(" o." + likeFields[index] + " like ?" + (index + 1)
						+ " ");
				out.append("and");
			}
			for (int index = 0; index < equalFields.length; index++) {
				out.append(" o." + equalFields[index] + "=?"
						+ (index + 1 + likeFields.length) + " ");
				out.append("and");
			}
			out.delete(out.length() - 3, out.length());
			result = out.toString();
		}

		return result;
	}

	/**
	 * 查询数据总数
	 * 
	 * @param entityClass
	 *            实体类
	 * @param whereJpql
	 *            查询条件
	 * @param args
	 *            查询参数
	 * @return 数据总数
	 * @author 
	 */
	public <T> Long getTotalCount(Class<T> entityClass, Object[] fields,
			Object... args) {
		String entityName = entityClass.getSimpleName();
		Query query = em.createQuery("select count(o) from " + entityName
				+ " as o " + buildWhereJpqlByLike(fields));
		for (int i = 0; i < args.length; i++) {
			query.setParameter(i + 1, args[i]);
		}
		return (Long) query.getResultList().get(0);
	}

	/**
	 * 查询数据总数
	 * 
	 * @param entityClass
	 *            实体类
	 * @param whereJpql
	 *            查询条件
	 * @param args
	 *            查询参数
	 * @return 数据总数
	 * @author 
	 */
	@Override
	public <T> Long getTotalCount(Class<T> entityClass, String whereJpql,
			Object... args) {
		String entityName = entityClass.getSimpleName();
		Query query = em.createQuery("select count(o) from " + entityName
				+ " as o " + whereJpql);
		for (int i = 0; i < args.length; i++) {
			query.setParameter(i + 1, args[i]);
		}
		return (Long) query.getResultList().get(0);
	}

	/**
	 * 获得查询数据总数
	 * 
	 * @param entityClass
	 *            实体类
	 * @param likeFields
	 *            模糊查询条件
	 * @param equalFields
	 *            等于查询条件
	 * @param equalValues
	 *            等于查询的值
	 * @param likeValues
	 *            模糊查询的值
	 * @return 数据条数
	 * @author 
	 */
	@Override
	public <T> Long getTotalCount(Class<T> entityClass, Object[] likeFields,
			Object[] equalFields, Object[] equalValues, Object... likeValues) {
		String entityName = entityClass.getSimpleName();
		Query query = em.createQuery("select count(o) from " + entityName
				+ " as o "
				+ buildWhereJpqlByLikeAndEqual(likeFields, equalFields));
		for (int i = 0; i < likeValues.length; i++) {
			query.setParameter(i + 1, likeValues[i]);
		}
		for (int i = 0; i < equalValues.length; i++) {
			query.setParameter(i + 1 + likeValues.length, equalValues[i]);
		}
		return (Long) query.getResultList().get(0);
	}

	/**
	 * 获得查询数据总数[用于判断某些具体参数是不是null的情况]
	 * 
	 * @param entityClass
	 *            实体类
	 * @param likeFields
	 *            模糊查询条件
	 * @param equalFields
	 *            等于查询条件
	 * @param equalValues
	 *            等于查询的值
	 * @param likeValues
	 *            模糊查询的值
	 * @return 数据条数
	 * @author 
	 */
	@Override
	public <T> Long getTotalCount(Class<T> entityClass, Object[] likeFields,
			Object[] equalFields, Object... likeValues) {
		String entityName = entityClass.getSimpleName();
		Query query = em.createQuery("select count(o) from " + entityName
				+ " as o "
				+ buildWhereJpqlByLikeAndEqualsIsNull(likeFields, equalFields));
		for (int i = 0; i < likeValues.length; i++) {
			query.setParameter(i + 1, likeValues[i]);
		}
		return (Long) query.getResultList().get(0);
	}

	/**
	 * 获得查询数据总数[用于判断某些参数相等有些参数不想等的情况]
	 * 
	 * @param entityClass
	 *            实体类
	 * @param equalFields
	 *            查询相等条件
	 * @param notEqualFields
	 *            不等于查询条件
	 * @param equalValues
	 *            等于查询的值
	 * @param notEqualValues
	 *            不等于查询的值
	 * @return 数据条数
	 * @author 
	 */
	@Override
	public <T> Long getTotalCountByEqualAndNotEqual(Class<T> entityClass,
			Object[] equalFields, Object[] notEqualFields,
			Object[] equalValues, Object... notEqualValues) {
		String entityName = entityClass.getSimpleName();
		Query query = em.createQuery("select count(o) from "
				+ entityName
				+ " as o "
				+ buildWhereJpqlByEqualsAndOtherNotEquals(equalFields,
						notEqualFields));
		for (int i = 0; i < equalValues.length; i++) {
			query.setParameter(i + 1, equalValues[i]);
		}
		for (int i = 0; i < notEqualValues.length; i++) {
			query.setParameter(i + 1 + equalValues.length, notEqualValues[i]);
		}
		return (Long) query.getResultList().get(0);
	}

	/**
	 * 获得查询数据总数[用于判断某些参数相似某些参数不等的情况]
	 * 
	 * @param entityClass
	 *            实体类
	 * @param likeFields
	 *            模糊查询条件
	 * @param notEqualFields
	 *            不等于查询条件
	 * @param likeValues
	 *            模糊查询的值
	 * @param notEqualValues
	 *            不等于查询的值
	 * @return 数据条数
	 * @author 
	 */
	@Override
	public <T> Long getTotalCountByLikeAndNotEqual(Class<T> entityClass,
			Object[] likeFields, Object[] notEqualFields, Object[] likeValues,
			Object[] notEqualValues) {
		String entityName = entityClass.getSimpleName();
		Query query = em.createQuery("select count(o) from "
				+ entityName
				+ " as o "
				+ buildWhereJpqlByLikeAndOtherNotEquals(likeFields,
						notEqualFields));
		for (int i = 0; i < likeValues.length; i++) {
			query.setParameter(i + 1, likeValues[i]);
		}
		for (int i = 0; i < notEqualValues.length; i++) {
			query.setParameter(i + 1 + likeValues.length, notEqualValues[i]);
		}
		return (Long) query.getResultList().get(0);
	}

}


 

 

 

你可能感兴趣的:(ejb,J2EE)