JPA -- HQL 查询( 手动写原生查询 sql,复杂查询必备)

1、添加 EntityManager

@PersistenceContext
private EntityManager entityManager;

2、hql 查询

	//拼接sql
	 String hql = findStatisHql( serverId,  channel,startTime,endTime);

    // 查询数据
	Query query = entityManager.createQuery(hql);

	// 根据返回的结果来定义接收数据类型(对象,集合,基本数据类型等),我这里查询统计数据,所以 list<Object[]>  接收,下方有示例代码
	List<Object[]> objArray = query.getResultList();
	

就是这么简单,不明白继续看下方示例代码

2.1 hql 查询方法示例

	/**
	 * hql 查询统计数据
	 * 
	 * @author wangsong
	 * @date 2019年9月10日
	 */
	@SuppressWarnings("unchecked")
	public Map<String, Object> findStatis(Integer serverId, String channel,String startTime,String endTime) {
		// 拼接sql
	    String hql = findStatisHql( serverId,  channel,startTime,endTime);
		// 查询数据
		Query query = entityManager.createQuery(hql);
		List<Object[]> objArray = query.getResultList();
		// 处理结果数据
		Map<String, Object> mapVal = new HashMap<String, Object>();
		List<Object> stepsList = new ArrayList<Object>();
		List<Object> conutList = new ArrayList<Object>();
		for (Object[] obj : objArray) {
			stepsList.add(obj[0]);
			conutList.add(obj[1]);
		}
		mapVal.put("stepsList", stepsList);
		mapVal.put("conutList", conutList);
		return mapVal;
	}

2.2 拼接sql 方法示例(拼接出的sql 同原生sql)


	/**
	 * 拼接hql 查询语句 <br/>
	 * hql =  select steps,count(*) from WastageRate where 1=1 and serverId=1 and channel='home' and time <= '2019-09-13' and time >= '2019-09-10 00:00:00' GROUP BY steps
	 * @author wangsong
	 * @date 2019年9月10日
	 */
	public String findStatisHql(Integer serverId, String channel,String startTime,String endTime) {
		// 动态拼接sql
		String hql = "select steps,count(*) from WastageRate where 1=1";
		if (serverId != null && serverId != -1) {
			hql += " and serverId=" + serverId;
		}
		if (StringUtils.isNotEmpty(channel) && !channel.equals("-1")) {
			hql += " and channel='" + channel +"'";
		}
		if (StringUtils.isNotEmpty(startTime)) {
			hql += " and time >= '"+startTime +"'";
		}
		if (StringUtils.isNotEmpty(endTime)) {
			hql += " and time <= '" + endTime +"'";
		}
		hql += " GROUP BY steps";
		return hql;
	}

2.3 页面展示(动态查询统计数据)

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值