3.3.2 查询——Criteria

本文介绍了一种灵活的对象查询方式——Criteria查询。它通过面向对象的方法封装SQL语句,实现动态查询。文章详细解释了CriteriaBuilder、CriteriaQuery等核心概念,并通过实例展示了如何进行分页查询。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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());



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值