目的:様々なパラメータの条件、WHERE句内の動的アセンブリHQL。
1.コードを実装
公共の一覧<WrapStatis> queryStatisCriteriaBuilder(文字列のstartTime、endTimeは文字列、文字列collectName、
IMEI文字列){ 一覧 <WrapStatis>一覧= 新しい新しいのArrayList <> (); 試み{ CriteriaBuilder CB = entityManager.getCriteriaBuilder(); // WrapStatisクエリ結果は、指定されたカスタムオブジェクトに返され CriteriaQuery <WrapStatis>クエリ= cb.createQuery( 。WrapStatisのクラス)、 ルート <StatisEntity> = query.fromルート(StatisEntity。クラス) パス <カレンダー> timePath = root.get( "CREATETIME" ); パスの<string> statisName = root.get( "statisName"); パス <文字列> statisNum = root.get( "statisNum" ); パス <ダブル> statisRate = root.get( "statisRate" ); 一覧 <述語> predicateList = 新しいのArrayList <述語> (); 日付たstartDate = DateUtils.parse(のstartTime、DateUtils.YMD_DASH_WITH_TIME)。 日endDateに = DateUtils.parse(endTimeは、DateUtils.YMD_DASH_WITH_TIME)。 もし(!のstartTime = NULL ){ predicateList.add(cb.between(root.get( "CREATETIME" )、たstartDate、endDateに))。 } 場合(StringUtils.isNotEmpty(collectName)){ predicateList.add(cb.equal(root.get( "collectName" )、collectName))。 } であれば(StringUtils.isNotEmpty(IMEI)&& imei.equals( "全て"! )){ predicateList.add(cb.equal(root.get( "IMEI" )、IMEI))。 } 述語[]述語 = 新しい述語[predicateList.size()]。 述語 = predicateList.toArray(述語)。 // 加上ここ条件 query.where(述語)。 // 指定查询项、選択后面的东西 式<文字列> timeStr = cb.function( "DATE_FORMAT"、文字列。クラス、timePath、cb.parameter(文字列。クラス、 "formatStr")); // 格式化日期 query.multiselect(timeStr、statisName、statisNum、statisRate)。// 返回列 // query.groupBy(root.get(conditionName)、timeStr)。// 分组 // query.orderBy(cb.asc(timeStr)); // 排序 TypedQuery <WrapStatis> typedQuery = entityManager.createQuery(クエリ);
typedQuery.setParameter( "formatStr" 、Constant.STATIS_DAY)。 リスト =typedQuery.getResultList(); } キャッチ(はParseException電子){ log.error( "StatisService queryStatisCriteriaBuilderがエラーで呼び出し" 、E)。 } 戻りリスト。 }
Constant.STATIS_DAY値:日フォーマットによる%D%のY-M-%で、印刷が完了したSQLが実行されます。
選択 DATE_FORMAT(statisenti0_.create_time、?)としてcol_0_0_、 statisenti0_.statis_name としてcol_1_0_、 statisenti0_.statis_num としてcol_2_0_、 statisenti0_.statis_rateのようcol_3_0_ からSTATISのstatisenti0_ (statisenti0_.create_time 間?及び?) と statisenti0_.collect_name = ? そして statisenti0_.kepler_version = ? そして statisenti0_.device_brand = ? そしてstatisenti0_.rom_version = ? そして statisenti0_.alipay_version =?
2.パッケージはwrapStatis.classです
パブリック クラスWrapStatis { プライベート文字列の日付。 プライベート文字列statisName。 プライベート文字列statisNum。 プライベートダブルstatisRate。 // 省略取得/セット/构造方法 }