網上大量的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; }