SpringData Jpa使用原始sql返回自定義對象

網上大量的copy文 真讓人難受...

最近學習了jpa,多表條件查詢時+分頁,使用了Query這個對象,翻閱了大量資料終於找到了方法

核心方法:

@PersistenceContext
EntityManager entityManager;
//這裏主要處理返回的自定義對象和字段類型 一定要和數據類型保持一致 比如bigInt=Long,varChar=String...
Query query = entityManager.createNativeQuery(querySql).unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.aliasToBean(自定義對象.class))
      //需要查詢處理的字段和類型
     //這裏的name必須和自定義對象的name一致!!!比如數據庫中是order_no必須轉爲orderNo
    .addScalar("id",StandardBasicTypes.LONG)
      .addScalar("companyName",StandardBasicTypes.STRING)
    .addScalar("orderNo",StandardBasicTypes.STRING)
      ;
//參數賦值
for (Map.Entry<String, Object> entry : params.entrySet()) {
   String key = entry.getKey();
   query.setParameter(key, entry.getValue());
   //分頁參數 過濾 limit :offset, :limit
   if (!key.equals("offset") && !key.equals("limit")) {
      countQuery.setParameter(key, entry.getValue());
   }
}

 

完整的代碼:

public List orderList(JSONObject body, Result result) {
      StringBuffer tableSql = new StringBuffer("SELECT s.id,s.order_no as orderNo,y.company_name as companyName ");
      StringBuffer countSql = new StringBuffer("SELECT count(*) ");
      StringBuffer selectSql = new StringBuffer();
      StringBuffer whereSql = new StringBuffer();
      StringBuffer orderBySql = new StringBuffer();
      //分頁
      Map<String, Object> params = new QueryUtil(body);
      StringBuffer limitSql = new StringBuffer(" limit :offset, :limit");
      selectSql.append(" FROM biz_orders s INNER JOIN biz_company y ON s.company_id = y.id INNER JOIN biz_user r ON s.user_id = r.id INNER JOIN biz_company_person pn ON y.id = pn.company_id AND pn.person_role = 1 ");
      selectSql.append(" WHERE s.order_status > 0 ");
      //下單日期 - 開始
      if (body.containsKey("payOrderTimeStart") && body.get("payOrderTimeStart") != null) {
         Date payOrderTimeStart = body.getDate("payOrderTimeStart");
         whereSql.append(" AND s.pay_order_time >= :payOrderTimeStart ");

         params.put("payOrderTimeStart", payOrderTimeStart);

      }
      //下單日期-結束
      if (body.containsKey("payOrderTimeEnd") && body.get("payOrderTimeEnd") != null) {
         Date payOrderTimeStart = body.getDate("payOrderTimeEnd");
         whereSql.append(" AND s.pay_order_time <= :payOrderTimeEnd ");
         params.put("payOrderTimeEnd", payOrderTimeStart);
      }
      //訂單號
      if (body.containsKey("orderNo") && body.get("orderNo") != null) {
         String orderNo = body.getString("orderNo");
         whereSql.append(" AND s.order_no = :orderNo ");
         params.put("orderNo", orderNo);
      }
      //用戶手機號
      if (body.containsKey("phoneNumber") && body.get("phoneNumber") != null) {
         String phoneNumber = body.getString("phoneNumber");
         whereSql.append(" AND r.phone_number = :phoneNumber ");
         params.put("phoneNumber", phoneNumber);
      }
      //首選公司名稱-模糊
      if (body.containsKey("companyName") && body.get("companyName") != null) {
         String companyName = body.getString("companyName");
         whereSql.append(" AND y.company_name LIKE :companyName");
         params.put("companyName", "%" + companyName + "%");
      }

      //公司類型
      if (body.containsKey("companyType") && body.get("companyType") != null) {
         Integer companyType = body.getInteger("companyType");
         whereSql.append(" AND y.company_type = :companyType ");
         params.put("companyType", companyType);
      }
      //是否代理記賬
      if (body.containsKey("bookkeeping") && body.get("bookkeeping") != null) {
         boolean bookkeeping = body.getBooleanValue("bookkeeping");
         if (bookkeeping) {
            whereSql.append(" AND s.bookkeeping_amount > 0 ");
         } else {
            whereSql.append(" AND s.bookkeeping_amount = 0 ");
         }
      }
      //收貨方式
      if (body.containsKey("receivingType") && body.get("receivingType") != null) {
         Integer receivingType = body.getInteger("receivingType");
         whereSql.append(" AND s.receiving_type = :receivingType ");

         params.put("receivingType", receivingType);
      }
      //訂單狀態
      if (body.containsKey("orderStatus") && body.get("orderStatus") != null) {
         Integer orderStatus = body.getInteger("orderStatus");
         whereSql.append(" AND s.order_status = :orderStatus ");

         params.put("orderStatus", orderStatus);
      }

      //排序
      orderBySql.append(" ORDER BY s.create_time DESC ");

      //查詢語句
      String querySql = tableSql.append(selectSql).append(whereSql).append(orderBySql).append(limitSql).toString();
    Query query = entityManager.createNativeQuery(querySql).unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.aliasToBean(BizOrders.class))
          //需要查詢處理的字段和類型
          .addScalar("id",StandardBasicTypes.LONG)
          .addScalar("companyName",StandardBasicTypes.STRING)
         ;

      Query query = entityManager.createNativeQuery(querySql).unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.aliasToBean(BizOrders.class))
            //需要查詢處理的字段和類型
            .addScalar("id",StandardBasicTypes.LONG)
            .addScalar("companyName",StandardBasicTypes.STRING)
            ;

      //count
      Query countQuery = entityManager.createNativeQuery(countSql.append(selectSql).append(whereSql).toString());
      //參數賦值
      for (Map.Entry<String, Object> entry : params.entrySet()) {
         String key = entry.getKey();
         query.setParameter(key, entry.getValue());
         //分頁參數 過濾 limit :offset, :limit
         if (!key.equals("offset") && !key.equals("limit")) {
            countQuery.setParameter(key, entry.getValue());
         }
      }
      //list
      List list = query.getResultList();
      //count
      long total = Long.valueOf(countQuery.getSingleResult().toString());
      entityManager.close();

      result.setData(list);
      result.setCount(total);

      return list;
   }

 

 

 

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