您的位置:首页 > 其它

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

2012-02-17 13:40 253 查看
简单重构了一下 底层: 只有重构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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: