使用JPA,用到统计功能需求,有条件查询,原生的不好弄,使用注解也不太会传自定义sql语句,网上学习了下面方法。
import org.hibernate.SQLQuery;
import org.hibernate.transform.Transformers;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import java.util.List;
import java.util.Map;
@PersistenceContext
private EntityManager entityManager;
//使用封装好的map对象,自定义查询出来之后转换成map,
public void SQLQuery(){
Query query = entityManager.createNativeQuery("自己写的SQL语句");
query.unwrap(SQLQuery.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
List rows = query.getResultList();
for (Object obj : rows) {
Map row = (Map) obj;
System.out.println("id = " + row.get("ID"));
System.out.println("name = " + row.get("NAME"));
}
下面是实际应用
//定义条件查询的语句
StringBuilder whereSql = new StringBuilder(" WHERE 1 = 1");
if (StringUtils.isNotBlank(dutydepart)){
whereSql.append(" and dutydepart = '"+dutydepart+"'");
}
//。。。省略多个条件
//多条件查询
//工单趋势统计
StringBuilder ordersql1=new StringBuilder("select DISTINCT workorderid,date_format(calltime,'%Y-%m') date from v_taskrecord ");
ordersql1.append(whereSql);
ordersql1.append(" ) a group by date");
StringBuilder ordersql=new StringBuilder("select date,count(*) num from ( ");
ordersql.append(ordersql1);
Query orderquery = em.createNativeQuery(ordersql.toString());
orderquery.unwrap(SQLQuery.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
List order = orderquery.getResultList();
map.put("order",order);
//客户服务统计
StringBuilder customersql1=new StringBuilder("select customerfee,customer,TIMESTAMPDIFF(HOUR,taskbegintime,taskendtime) fuwutime from v_taskrecord ");
customersql1.append(whereSql);
customersql1.append(" and taskbegintime is not null and taskendtime is not null ) a group by customer");
StringBuilder customersql=new StringBuilder("select customer,count(*) num ,sum(fuwutime) fuwutime,sum(customerfee) customerfee from ( ");
customersql.append(customersql1);
Query customerquery = em.createNativeQuery(customersql.toString());
customerquery.unwrap(SQLQuery.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
List customer = customerquery.getResultList();
map.put("customer",customer);
后面是网上介绍的其余方法
//多表查询,并把结果封装到自定义类,
@Override
public List<A> getListItem() {
String sql="SELECT name from table_name" ;
Query query = em.createNativeQuery(sql);
query.unwrap(SQLQuery.class)
.addScalar("name", StandardBasicTypes.STRING)
.setResultTransformer(Transformers.aliasToBean(A.class));
return query.getResultList();
}
//多表查询,单个值
@Override
public Long getTotalNumber() {
String sql="SELECT COUNT(*) count from table_name";
Query query = em.createNativeQuery(sql);
Long count=((BigInteger)query.getSingleResult()).longValue();
return count;
}
//单个对象
@Override
public A getName(String indexId) {
String sql="SELECT * FROM t_index_info WHERE index_id='"+indexId+"'";
Query query = em.createNativeQuery(sql,A.class);
return (A)query.getSingleResult();
}
//单个字段
private List<String> getIndexId(){
String sql="SELECT index_id FROM table_name";
Query query = em.createNativeQuery(sql);
return query.getResultList();
}
//对象列表
@Override
public List<Bean> getSM(){
String sql="SELECT nav.index_id,nav.index_name FROM table_name nav " ;
Query query = em.createNativeQuery(sql,Bean.class);
return query.getResultList();
}
@Override
public Object queryCaptureRatio() {
String sql="";
Query query = em.createNativeQuery(sql);
query.unwrap(SQLQuery.class)
.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
return query.getSingleResult();
}