使用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();
}