序文
Spring-Data-JPAの基本的な紹介:JPAの誕生の理由は、サードパーティのORMフレームワークを統合し、標準的な方法を確立することです。 Baidu Encyclopediaは、JDKがORMの団結を達成するためにこの方向に発展していると言います。ただし、完全には実装されていません。 ORMフレームワークでは、Hibernateは大規模な軍隊であり、広く使用され、便利で、強力な能力を持っています。同時に、HibernateはJPAとも十分に統合されています。 JPAが標準であると考えることができます。実際、JPAはほとんどすべてのインターフェイスであり、実装はすべて冬眠によって行われます。マクロの観点から見ると、HibernateはJPAの統一の下で非常にうまく機能します。
最近、私はSpringbootおよびSpring Data JPAを使用しています。 JPAを使用すると、データベースの操作により便利になりますが、使用中に多くの落とし穴に遭遇しました。次の記事を記録します。以下ではあまり言いません。詳細な紹介を一緒に見てみましょう。
シーン:
動的クエリ、ページングクエリ、さまざまな状態に応じた異なるデータテーブルのクエリが渡され、ページオブジェクトを渡す前にMAPを使用してVOを変換します。ページ可能な異なる使用場所は、ページデータの正確性に影響を与えるため、説明します。
前提:
ページオブジェクトはVOに囲まれており、返されるデータにはページデータが含まれています
@ApimodelProperty( "RECORD")プライベートページ<ActivityRecordVo> ActivityRecordVolist; @ApimodelProperty( "Quants")private Integer num = 0; @ApimodelProperty( "lument")private bigdecimal totalmoney = bigdecimal.valueof(0);
誤ったアプリケーション:
List <ActivityRecordVo> ActivityRecordVolist = new ArrayList <>(); if(ReceivesEndRecordRequestVo.getSendorreCeiveType()== sendorreceiveType.receive){list <ChallengereCord> ChallengereCordList = ChallengereCordDao.findbyUseridDeleteType(UserID、DeleteType.false); if(!collectutils.isempty(ChallengereCordList)){ActiveRecordVolist = ChallengereCordList.stream().Map(this :: ChallengereCordToActivityRecordVo).collect(collectors.tolist()); }} else if(ReceivesEndRecordRequestVo.getSENDORRECEIVETYPE()== sendorreceiveType.send){list <cative> ActivityList = ActivityDao.findbyUseridDeleteType(userid、deleteType.false); if(!collectutils.isempty(ActivityList)){ActivityRecordVolist = ActivityList.stream().map(this :: ActivityToActivityRecordVo).collect(collectors.tolist()); }}ActivityReceiveSendRecordVo.SetActivityRecordVolist(new PageImpl <>(ActiveRecordVolist、pageable、activityRecordVolist.size()));
分析:渡されたページーは、新しいPageIMLのみを使用して、VOに設定したときにリストをページオブジェクトに変換します。フロントエンドで報告されているページの総数と総数は正しいですが、最初のページの行の数はすべてであり、データは異常です!
正しい参照方法:
仕様を使用して、クエリ条件に応じて対応するページングオブジェクトを動的にクエリしてマッピングします(このブロックコードは要件によって異なります)。この時点で、Findallで通過したページ可能な渡されたものが効果的であり、正しいページング情報が表示されます。
コードブロックリファレンス:
xxxcommonspecutilは、ネイティブスプリングデータJPAネイティブクエリメソッドと同様に、自称仕様ツールクラスです。
Page <ActivityRecordVo>ページ= new PageImpl <>(ActiveRecordVolist、pageable、ActivityRecordVolist.size()); if(ReceivesEndRecordRequestVo.getSendorreCeiveType()== sendorreceiveType.receive){仕様<ChallengereCord> spec =仕様。 page = challengerecorddao.findall(spec、pageable).map(this :: challengerecordtoactivityrecordvo); } else if(ReceivesEndRecordRequestvo.getSendorreceiveType()== sendorreceiveType.send){仕様<avity <avity> spec =仕様。 page = activitydao.findall(spec、pageable).map(this :: ActivityToActivityRecordVo); }注: ActivityReceiveSendRecordVoはカプセル化されたVOであり、返されたページオブジェクトが含まれています
ActivityReceiveSendRecordVo.SetActivityRecordVolist(page);
要約します
Spring Data JPAを長い間使用した後、仕様は非常に便利であり、エラーが発生しやすいと思います。また、私のお気に入りのエンコードスタイルでもあります。ただし、通常、新しいpageImpl <>()のシンプルで粗い方法を使用して、データを照会し、あまりにも多くのテーブルを関連付けます。最後に直接戻ります。より深いレベルについて再び議論する必要があります!
さて、上記はこの記事のコンテンツ全体です。この記事の内容には、すべての人の研究や仕事に特定の参照値があることを願っています。ご質問がある場合は、メッセージを残してコミュニケーションをとることができます。 wulin.comへのご支援ありがとうございます。