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')
posted on 2017-01-04 15:32  dreamstar  阅读(52)  评论(0编辑  收藏  举报