Hibernate中Criteria的使用

本文介绍如何在Hibernate中使用createAlias和setFetchMode进行复杂查询。通过示例展示了如何关联多个实体类进行筛选,并针对单一实体类查询多实体字段的方法。

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

如若筛选条件是多个实体类的字段组成的,则可以使用createAlias关联相关的实体类,进行查询。

例如:

@SuppressWarnings("unchecked")
	public PaginationQuery<Product> list(ProductDto productDto, Page page) {
		Criteria criteria = this.getCurrentSession().createCriteria(Product.class,"p")
				.createAlias("document","d").createAlias("customer","c");
		if(productDto != null){
			if(StringUtils.isNotBlank(productDto.getWorkOrdeName())){
				criteria.add(Restrictions.like("p.workOrderName", "%" + productDto.getWorkOrdeName() + "%"));
			}
			if(productDto.getDeployStatus() != null && productDto.getDeployStatus().length != 0){
				List<Integer> statusList = Arrays.asList(productDto.getDeployStatus());
				criteria.add(Restrictions.in("p.status", statusList));
			}
			//关联document
			if(StringUtils.isNotBlank(productDto.getStartTime())){
				try {
					Date startTime = df.parse(productDto.getStartTime());
					criteria.add(Restrictions.ge("d.documentStatTime", startTime));
				} catch (ParseException e) {
					log.error("开始时间转换异常", e);
				}
			}
			if(StringUtils.isNotBlank(productDto.getEndTime())){
				try {
					Date endTime = df.parse(productDto.getEndTime());
					criteria.add(Restrictions.le("d.documentStatTime", endTime));
				} catch (ParseException e) {
					log.error("结束时间转换异常", e);
				}
			}
			//关联customer
			if(StringUtils.isNotBlank(productDto.getCustomerName())){
				criteria.add(Restrictions.eq("c.name", productDto.getCustomerName()));
			}
		}
		if(page != null){
			//总条数
			List<Product> list = criteria.list();
			if(list != null){
	 			int total = list.size();
				page.setRecordCount(total);
			}
			//分页
			criteria.setMaxResults(page.getSize());
			criteria.setFirstResult(page.getIndex()*page.getSize());
		}
		criteria = criteria.addOrder(Order.desc("p.createTime"));
		PaginationQuery<Product> paginationQuery = new PaginationQuery<>();
		paginationQuery.setPlist(criteria.list());
		paginationQuery.setPage(page);
		return paginationQuery;
	}

如若筛选条件就是一个实体类的字段,而查询的字段是多个实体类的字段,则可用setFetchMode进行查询。

例如:

@SuppressWarnings("unchecked")
	public Customer getByName(String name) {
		Criteria criteria = this.getCurrentSession().createCriteria(
				Customer.class);

		if (StringUtils.isNotEmpty(name)) {
			criteria.add(Restrictions.eq("name", name));
		}
		criteria.add(Restrictions.eq("enable", true));
		criteria.setFetchMode("strategies", FetchMode.SELECT);
		List<Customer> customers = criteria.list();
		if (customers != null && customers.size() > 0) {
			return customers.get(0);
		}
		return null;
	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值