重构巴巴运动网 --- 底层重构--where语句重构 基于JPA2.0 Criteria

简单重构了一下 底层:  只有重构where查询。。。 

其实前一断时间已经完成了..   只是一个练手之作 

个人推荐   一些固定的查询语句还是使用JQL直接查询  效果最佳 

而一些需要你动态拼装字符的可以使用Criteria查询   这样子效率更高


追加两个类用来存放值

public class QueryObject {
	private String queryName;
	private Object queryValue;
	
	public QueryObject(String queryName, Object queryValue) {
		super();
		this.queryName = queryName;
		this.queryValue = queryValue;
	}
	public String getQueryName() {
		return queryName;
	}
	public void setQueryName(String queryName) {
		this.queryName = queryName;
	}
	public Object getQueryValue() {
		return queryValue;
	}
	public void setQueryValue(Object queryValue) {
		this.queryValue = queryValue;
	}
	
}


public enum QueryType {
	GREATERTHAN{public String getName(){return "大于";}},
	LESSTHAN{public String getName(){return "小于";}},
	EQUAL{public String getName(){return "等于";}};
	abstract String getName();
}




DAO层 追加接口

public QueryResult<T> getScrollData(HashMap<QueryObject,QueryType> where);  // 此处泛型必须为此顺序,否则存入是以key作为存放的索引,后者将会把前者覆盖 


DaoSupport 实现

@Override
	public QueryResult<T> getScrollData(HashMap<QueryObject,QueryType> where) {
		CriteriaBuilder cb = em.getCriteriaBuilder();
		CriteriaQuery<T> cq = cb.createQuery(entityClass);
		Root<T> root = cq.from(entityClass);
		
		cq.where(cb.and(buildQueryWhere(cb, root, where).toArray(new Predicate[0])));
		
		TypedQuery<T> query = em.createQuery(cq);
		
		QueryResult<T> qr = new QueryResult<T>();
		qr.setResultlist(query.getResultList());
		
		return qr;
	}



构建where 语句方法:

protected static <T> List< Predicate> buildQueryWhere(CriteriaBuilder cb,Root<T> root,HashMap<QueryObject,QueryType> where){
		List< Predicate> predicates = new ArrayList< Predicate>();
		for(Map.Entry<QueryObject,QueryType> entry : where.entrySet()){	
			QueryType qt = entry.getValue();
			QueryObject qo = entry.getKey();
			switch (qt) {
			case EQUAL:
				predicates.add(cb.equal(root.get(qo.getQueryName()), qo.getQueryValue()));
				break;
			case GREATERTHAN:
				predicates.add(cb.gt(root.<Integer>get(qo.getQueryName()),Integer.parseInt(qo.getQueryValue().toString())));
				break;
			case LESSTHAN:
				predicates.add(cb.lt(root.<Integer>get(qo.getQueryName()),Integer.parseInt(qo.getQueryValue().toString())));
				break;
			default:
				System.out.println("还没定义呢。。。 ");
			}
		}
		
		return predicates;
	}




测试类。。。 

@Test
	public void testGetScrollData(){
		HashMap<QueryObject,QueryType > where = new HashMap<QueryObject,QueryType >();
		
		where.put(new QueryObject("gender",Gender.MAN) , QueryType.EQUAL);
		where.put(new QueryObject("password", "123123") , QueryType.EQUAL );
		
		QueryResult<Buyer> qr = buyerService.getScrollData(where);
		for(Buyer buyer : qr.getResultlist()){
			System.out.println(buyer.getUsername() + "  " + buyer.getRegTime() + "  " + buyer.getGender());
		}
	}




 查询结果:

Hibernate: select buyer0_.username as username1_, buyer0_.contact_id as contact8_1_, buyer0_.email as email1_,

 buyer0_.gender as gender1_, buyer0_.password as password1_, buyer0_.realname as realname1_, buyer0_.regTime 

as regTime1_, buyer0_.visible as visible1_ from Buyer buyer0_ where buyer0_.password=? and buyer0_.gender=?

liming  2012-02-16 21:50:31.0  MAN

tiantian  2012-02-16 22:07:51.0  MAN



你可能感兴趣的:(重构巴巴运动网 --- 底层重构--where语句重构 基于JPA2.0 Criteria)