例:
User と Address という 2 つのエンティティ クラスがあります
データベース:
リーリーmybatis マッピング構成:
リーリーユーザーとアドレスの関係は次のとおりです。1 人のユーザーは複数のアドレスを持ち、1 つのアドレスは 1 人のユーザーにのみ属することができ、1 対多です。
現在の需要は、ページ内のユーザーをクエリし、ページ内にユーザーを表示することであると仮定します。テーブルを作成し、各ユーザーを配置します。 すべてのアドレスが表示されます。
その後、問題が発生します。
上記のクエリに従って返されたページング データには問題はありませんが、ページング レコードの総数が間違っています。
たとえば、見つかったデータ (ページ表示ではなくデータベース データ) は次のとおりです:
u_id | ユーザー名 | ###援助### ###詳細###1 | |
---|---|---|---|
1 | 北京市海頂区 | 1 | |
2 | 北京市朝陽区 | 2 | |
3 | 天津市 | 私の要件はページにユーザーを表示することなので、ユーザーはページに表示される次のようなデータです。理論的には、これは 2 つのデータです。 |
ユーザー名
###住所###1 | ユーザー1 | 1. 北京市海淀区 2. 北京市朝陽区 |
---|---|---|
2 | ユーザー2 | 1. 天津市 |
合計1ページ、合計2つのデータ、各ページに10個表示されます | しかし、mybatis の find_count 設定によると、項目が 3 つあることがわかります。 | count(*) をクエリするとき、左結合に関連付けられたすべてのテーブルを削除する必要がありますか?これにより、返されるデータが不正確になりますか|
追加説明: 私が言いたかったことを皆さんが誤解されているようです。実際、私の問題は主に SQL にあり、mybatis ではありません。なぜなら、クエリしたデータがマップされた後はまったく問題がなかったからです。ページング レコードの総数に問題があるため、誤ったページングが発生します。 |
例を書いてテストしてみました
`
2 つのエンティティ クラス
リーリーパブリック クラス ユーザー {
パブリッククラスアドレス{
リーリーマッピング ファイル
リーリー<resultMap type="com.atguigu.mybatis.entity.User" id="userMap" autoMapping="true">
<!-- tu.,ta.、 -->
<!-- ta.id を 'a_id' として選択、 -->
キーワードをグループ化して、具体的な操作を自分で確認してください
リーリー
2 つの項目が必要ですが、SQL では 3 つの項目が見つかるため、エラーが表示されます。
それではロジックを分割する必要があります。
最初に必要なユーザーを見つける必要があります。 リーリー
リーリー
??userIdを使ってList<Address>を自分で確認する方法ですこの場合、このようにページングを行うことはできません。メインテーブルのデータをページ分割する必要があります。
当初は 100 個のデータがクエリされましたが、1 対多では多くのデータがフォールドされ重複排除されるため、実際の結果は 100 個未満になりました。
この場合、ネストされたクエリを使用して問題を解決できます。これには N+1 回の実行が必要で、遅延読み込みが可能です。
またはここをご覧ください: https://my.oschina.net/flags/...
MyBatis のコンテンツについては、こちらをご覧ください: http://mybatis.tk
リーリー
変更:
リーリーサブクエリを使えば問題ありません
リーリー作成者は、
Mybatis-PageHelper
count SQL 変換の実装を確認できます作者は Mybatis-PageHelper を直接使用してページングを実装することをお勧めします