Criteria查询是一种可编程的、类型安全的方式来表示查询。Criteria 查询采用面向对象方式封装查询条件,又称为对象查询;就是对SQL 语句进行封装,采用对象的方式来组合各种查询条件。由Hibernate 自动产生SQL 查询语句
条件生成器,负责构建整个查询条件,得到Criteria对象。
动态查询的步骤:
1.CriteriaBuilder
CriteriaBuilder builder = super.entityManager.getCriteriaBuilder();
2.CriteriaQueryCriteriaQuery<Order> query = builder.createQuery(Order.class);
3.Root表示要查询的数据类型的抽象,通过Root可以得到属性的各种表达式
Root<Order> root = query.from(Order.class);
4.ExpressionPredicate predicate = builder.between(root.get("orderTime"), start, end);
query.where(predicate);query.orderBy(builder.desc(root.get("id")));
5.TypedQueryTypedQuery<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());