java - Mybatisデータベースのマルチテーブル関連のページング問題
黄舟
黄舟 2017-06-10 09:49:39
0
6
1517

例:
User と Address という 2 つのエンティティ クラスがあります

リーリー

データベース:

リーリー

mybatis マッピング構成:

リーリー

ユーザーとアドレスの関係は次のとおりです。1 人のユーザーは複数のアドレスを持ち、1 つのアドレスは 1 人のユーザーにのみ属することができ、1 対多です。
現在の需要は、ページ内のユーザーをクエリし、ページ内にユーザーを表示することであると仮定します。テーブルを作成し、各ユーザーを配置します。 すべてのアドレスが表示されます。
その後、問題が発生します。
上記のクエリに従って返されたページング データには問題はありませんが、ページング レコードの総数が間違っています。
たとえば、見つかったデータ (ページ表示ではなくデータベース データ) は次のとおりです:

###援助### ###詳細### ユーザー1ユーザー1ユーザー2
u_id ユーザー名 1
1 北京市海頂区 1
2 北京市朝陽区 2
3 天津市 私の要件はページにユーザーを表示することなので、ユーザーはページに表示される次のようなデータです。理論的には、これは 2 つのデータです。
###ユーザーID###

ユーザー名

###住所### count(*) をクエリするとき、左結合に関連付けられたすべてのテーブルを削除する必要がありますか?これにより、返されるデータが不正確になりますか追加説明: 私が言いたかったことを皆さんが誤解されているようです。実際、私の問題は主に SQL にあり、mybatis ではありません。なぜなら、クエリしたデータがマップされた後はまったく問題がなかったからです。ページング レコードの総数に問題があるため、誤ったページングが発生します。
1 ユーザー1 1. 北京市海淀区 2. 北京市朝陽区
2 ユーザー2 1. 天津市
合計1ページ、合計2つのデータ、各ページに10個表示されます しかし、mybatis の find_count 設定によると、項目が 3 つあることがわかります。
黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全員に返信(6)
漂亮男人

例を書いてテストしてみました

`

2 つのエンティティ クラス
パブリック クラス ユーザー {

リーリー

パブリッククラスアドレス{

リーリー

マッピング ファイル
<resultMap type="com.atguigu.mybatis.entity.User" id="userMap" autoMapping="true">

リーリー

<!-- tu.,ta.、 -->
<!-- ta.id を 'a_id' として選択、 -->

いいねを押す +0
左手右手慢动作

キーワードをグループ化して、具体的な操作を自分で確認してください

いいねを押す +0
学霸

リーリー

2 つの項目が必要ですが、SQL では 3 つの項目が見つかるため、エラーが表示されます。
ロジックを分割する必要があります。
最初に必要なユーザーを見つける必要があります。 リーリー

それでは

リーリー

??userIdを使ってList<Address>を自分で確認する方法です

いいねを押す +0
学霸

この場合、このようにページングを行うことはできません。メインテーブルのデータをページ分割する必要があります。

当初は 100 個のデータがクエリされましたが、1 対多では多くのデータがフォールドされ重複排除されるため、実際の結果は 100 個未満になりました。

この場合、ネストされたクエリを使用して問題を解決できます。これには N+1 回の実行が必要で、遅延読み込みが可能です。

またはここをご覧ください: https://my.oschina.net/flags/...

MyBatis のコンテンツについては、こちらをご覧ください: http://mybatis.tk

いいねを押す +0
扔个三星炸死你

リーリー

変更:

リーリー
いいねを押す +0
曾经蜡笔没有小新

サブクエリを使えば問題ありません

リーリー

作成者は、Mybatis-PageHelper count SQL 変換の実装を確認できます

作者は Mybatis-PageHelper を直接使用してページングを実装することをお勧めします

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート