Jpa 自定義SQL語句條件查詢,多表關聯查詢

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章