重构巴巴运动网 --- 底层重构--where语句重构 基于JPA2.0 Criteria
2012-02-17 13:40
253 查看
简单重构了一下 底层: 只有重构where查询。。。
其实前一断时间已经完成了.. 只是一个练手之作
个人推荐 一些固定的查询语句还是使用JQL直接查询 效果最佳
而一些需要你动态拼装字符的可以使用Criteria查询 这样子效率更高
追加两个类用来存放值
DAO层 追加接口
DaoSupport 实现
构建where 语句方法:
测试类。。。
查询结果:
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
其实前一断时间已经完成了.. 只是一个练手之作
个人推荐 一些固定的查询语句还是使用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
相关文章推荐
- 详解JPA 2.0动态查询机制:Criteria API(1)
- 详解JPA 2.0动态查询机制:Criteria API(2)
- 详解JPA 2.0动态查询机制:Criteria API(3)
- spring boot2.0 连接mysql ,自定义JpaRepository 分页, 封装jpa底层sql(二)
- JPA2.0学习笔记---Criteria 查询
- SQL语句中的Having子句与where子句之区别
- Oracle数据库(where语句和列表达式)
- SQL语句中where 1=1 对性能的影响,where 与having的区别,where子句的性能
- 基于.NET 2.0的GIS开源项目SharpMap分析手记(十一):SharpMap影像准备——基于ERDAS的GEOTIFF图像生产过程
- jpa查询语句学习
- 一个还算简单的微信消息SDK(基于.Net Standard 2.0)
- SQL语句中的Having子句与where子句之区别
- [Spark机器学习]基于Spark 2.0 机器学习之推荐系统实现
- 演示基于SDL2.0+FFmpeg的播放器
- JPA 2.0 中的动态类型安全查询
- spring data jpa介绍jpql语句
- 基于Ajax的Web框架Echo2 2.0 正式发布
- JSF 2.0(基于Primefaces 3.4.2) 中文乱码的处理方案
- EMAIL发送系统(C#+基于SMTP认证) 2.0