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

 

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