Hibernate hql
自己扩展jpa 查询
逻辑可能不太通,只是记录下动态拼接sql的写法
在DAO层声明
public List<Object[]> getRecordsByCondition(Map<String, Object> searchParams);
在DAO层的实现类里写下面三个方法
import javax.persistence.Query;
//hql语句 几个要素 select 选择的元素,其中DataRecord类中time字段查询后的显示格式为'%Y-%m-%d %T'
//from后跟表名 四张表拼接
//where后跟 四张表之间的外键关系
//searchParams存的是查询条件
public List<Object[]> getRecordsByCondition(Map<String, Object> searchParams){
String hql= "select dr.sensor.id,DATE_FORMAT(dr.time,'%Y-%m-%d %T'),dr.value"
+ " from DataRecord dr, Sensor sensor, SensorType st, Area area "
+ " where dr.sensor.id=sensor.id and sensor.sensorType.id= st.id and sensor.area.id= area.id ";
hql += this.prepareHql(searchParams); // 拼接查询条件
Query q = em.createQuery(hql);
this.setValue(searchParams, q); //设置查询条件
List<Object[]> list = q.getResultList();
return list;
}
设置查询条件的值
//主要看q.setParameter("areaId", param); 的两个参数怎么样,精确查询,模糊查询,param类型要和实体类中该字段的类型一样
private void setValue(Map<String, Object> searchParams, Query q) throws ParseException {
String area = (String) searchParams.get("area"); // 区域有限制,给区域条件赋值
if (!StringUtils.isNullorEmpty(area)) {
Long areaId = new Long(area);
q.setParameter("areaId", areaId); // 设置区域查询条件的值
}
String sensorType = (String) searchParams.get("sensorType");
if (!StringUtils.isNullorEmpty(sensorType)) {
Long sensorTypeId = new Long(sensorType);
q.setParameter("stId", sensorTypeId);// 设置传感器类型查询条件的值
}
String sensor = (String) searchParams.get("sensor");
if (!StringUtils.isNullorEmpty(sensor)) {
q.setParameter("sensorName", "%"+sensor+"%");// 设置传感器名称查询条件的值,模糊查询
}
if (true) {
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
Date month= df.parse("2016-12-01"); //设置选择的月份为16年12月
q.setParameter("monthSelected", month);
}
}
if (true) { // 默认情况下,查询日期为当天,图表类型为日报表
DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); // 按日期查询,横坐标精确到秒
Date day= df.parse("2016-12-11"); //设置查询的日期为16年12月1日
q.setParameter("daySelected", day);
}
}
拼接查询语句
//主要看buffer.append()的内容
//=,like,TIMESTAMPDIFF()方法
private String prepareHql(Map<String, Object> searchParams) {
StringBuffer buffer = new StringBuffer();
String area = (String) searchParams.get("area"); // 区域有限制,拼接如下查询条件
if (!StringUtils.isNullorEmpty(area))
buffer.append(" and area.id=:areaId");
String sensorType = (String) searchParams.get("sensorType"); // 传感器类型有限制,拼接如下查询条件
if (!StringUtils.isNullorEmpty(sensorType))
buffer.append(" and st.id=:stId");
String sensor = (String) searchParams.get("sensor"); // 传感器名称有限制,拼接如下查询条件
if (!StringUtils.isNullorEmpty(sensor))
buffer.append(" and sensor.name like :sensorName ");
if (true) { // 查询当月monthSelected的所有记录
buffer.append(" and TIMESTAMPDIFF(DAY,dr.time,:monthSelected)<0 AND TIMESTAMPDIFF(DAY,dr.time,:monthSelected)>-32 ");
}
if (true) { // 查询当天daySelected的所有记录
buffer.append(" and TIMESTAMPDIFF(HOUR,dr.time,:daySelected)<0 AND TIMESTAMPDIFF(HOUR,dr.time,:daySelected)>-25");
}
return buffer.toString();
}
注意
q.setParameter(“sensorName”, “%”+sensor+”%”);的第一个参数sensorName
和buffer.append(” and sensor.name like :sensorName “);冒号后的参数sensorName 要保持一致
//主要看平均值avg()方法
select dr.sensor.id, DATE_FORMAT(dr.time,'%Y-%m-%d'),avg(dr.value)
GROUP BY dr.sensor.id,DATE_FORMAT(dr.time,'%Y-%m-%d')