3.3.2 查询——Criteria

来源:互联网 发布:鬼子来了被禁 知乎 编辑:程序博客网 时间:2024/06/06 10:44

Criteria查询是一种可编程的、类型安全的方式来表示查询。Criteria 查询采用面向对象方式封装查询条件,又称为对象查询;就是对SQL 语句进行封装,采用对象的方式来组合各种查询条件。由Hibernate 自动产生SQL 查询语句
 

CriteriaBuilder(javax.persistence.criteria.CriteriaBuilder
条件生成器,负责构建整个查询条件,得到Criteria对象。
动态查询的步骤
1.CriteriaBuilder

CriteriaBuilder builder = super.entityManager.getCriteriaBuilder();

2.CriteriaQuery

CriteriaQuery<Order> query = builder.createQuery(Order.class);

3.Root
表示要查询的数据类型的抽象,通过Root可以得到属性的各种表达式

Root<Order> root = query.from(Order.class);

4.Expression

Predicate predicate = builder.between(root.get("orderTime"), start, end);

query.where(predicate);

query.orderBy(builder.desc(root.get("id")));

5.TypedQuery
TypedQuery<Order> orderQuery =
super.entityManager.createQuery(query);

6.查询结果

orderQuery.getResultList();

例子:

(1)


(2)分页查询

                User user = new User();user.setId(1L);// 查出对应用户所有订单CriteriaBuilder builder = super.entityManager.getCriteriaBuilder();CriteriaQuery<Order> criteria = builder.createQuery(Order.class);Root<Order> root = criteria.from(Order.class);criteria.select(root);criteria.where(builder.equal(root.get("user"), user));// 查出对应用户所有订单数量CriteriaQuery<Long> numQuery = builder.createQuery(Long.class);Root<Order> numRoot = numQuery.from(Order.class);Expression<Long> expr = builder.count(numRoot.get("id"));numQuery.select(expr);numQuery.where(builder.equal(numRoot.get("user"), user));Long count = super.entityManager.createQuery(numQuery).getSingleResult();// 进行分页// 设置当前页面int pageSize = 20;int currentPage = 4;// 计算总页数int totalPages = (int) (count / pageSize == 0 ? count / pageSize: count / pageSize + 1);if (currentPage > totalPages) {currentPage = totalPages;}TypedQuery<Order> resQuery = super.entityManager.createQuery(criteria);int firstResult = (currentPage - 1) * pageSize;          resQuery.setFirstResult(firstResult);//设置第一条返回结果的位置          resQuery.setMaxResults(pageSize);//设置返回结果最大条数// 计算查询所用时间long before = System.currentTimeMillis();List<Order> resList = resQuery.getResultList();long useTime = System.currentTimeMillis() - before;System.out.println("所用时间" + useTime);System.out.println(resList.size());System.out.println(resList.get(0).getId());



原创粉丝点击