찾다

 >  Q&A  >  본문

java - Mybatis 데이터베이스 다중 테이블 관련 페이징 문제

예:
사용자와 주소라는 두 개의 엔터티 클래스가 있습니다

으아악

데이터베이스:

으아악

mybatis 매핑 구성:

으아악

사용자와 주소의 관계는 다음과 같습니다. 한 사용자는 여러 개의 주소를 갖고, 하나의 주소는 한 명의 사용자에게만 속할 수 있으며, 일대다
현재 수요는 페이지에서 사용자를 쿼리하고, 이를 테이블에 표시하고, 모두 표시하는 것입니다. 각 사용자의 주소가 나오네요
그러면 문제가 옵니다
위 쿼리에 따라 반환된 페이징 데이터에는 문제가 없지만 총 페이징 기록 수가 잘못되었습니다.
예를 들어 검색된 데이터(페이지 표시가 아닌 데이터베이스 데이터)는 다음과 같습니다.

u_id 사용자 이름 a_id 세부사항
1 user1 1 베이징 하이뎬구
1 user1 2 베이징 차오양구
2 user2 3 천진시

제 요구 사항은 사용자를 페이지에 표시하는 것이므로 사용자는 페이지에 표시되는 데이터 조각입니다. 이론적으로는 다음과 같은 두 조각의 데이터입니다.

사용자 ID사용자 이름주소1user1 1. 베이징 하이뎬구 2. 베이징 조양구 2user21. 텐진시총 1페이지, 총 2개의 데이터, 각 페이지에는 10개의 데이터가 표시됩니다
그런데 mybatis의 find_count 구성에 따르면 3가지 항목이 있는 것으로 나타났습니다. 이 문제를 해결하려면 어떻게 해야 할까요?

count(*)를 쿼리할 때 왼쪽 조인과 관련된 모든 테이블을 제거해야 합니까? 이로 인해 반환된 데이터가 부정확해 집니까?


추가 설명: 사실 제 문제는 주로 mybatis가 아닌 SQL에 관한 것입니다. 제가 쿼리한 데이터가 매핑된 후에는 전혀 문제가 없었고 단지 페이징뿐이었기 때문입니다. 총 레코드 수에 문제가 있어 잘못된 페이징이 발생합니다

黄舟黄舟2757일 전1536

모든 응답(6)나는 대답할 것이다

  • 漂亮男人

    漂亮男人2017-06-10 09:51:39

    예제를 작성하고 테스트해봤습니다

    `

    두 개의 엔터티 클래스
    public 클래스 사용자 {

    으아악

    공개 수업 주소 {

    으아악

    매핑 파일
    <resultMap type="com.atguigu.mybatis.entity.User" id="userMap" autoMapping="true">

    으아악

    <!-- tu.,ta., -->
    <!-- ta.id를 'a_id'로 선택, -->
    <!-- tu.id를 'u_id'로 선택 -->
    <!-- t_user tu에서, -->
    <!-- t_address ta 여기서 ta.user_id=tu.id -->

    으아악

    테스트 결과

    캡슐화된 List<User>의 크기는 문제가 되지 않습니다.

    회신하다
    0
  • ringa_lee

    ringa_lee2017-06-10 09:51:39

    키워드를 그룹화하고 구체적인 동작을 직접 확인해보세요

    회신하다
    0
  • 欧阳克

    欧阳克2017-06-10 09:51:39

    으아악

    두 개의 항목을 원했지만 SQL이 세 개의 항목을 찾으면 오류가 표시됩니다.
    논리를 분할해야 합니다.
    먼저 원하는 사용자를 찾아야 합니다

    으아악

    그럼

    으아악

    ??사용자ID를 이용해서 List<Address>를 직접 확인하는 방법이에요

    회신하다
    0
  • 欧阳克

    欧阳克2017-06-10 09:51:39

    이 경우에는 페이징을 할 수 없습니다. 메인 테이블 데이터를 페이징해야 합니다.

    원래는 100개의 데이터를 쿼리했는데, 일대다 방식은 많은 양의 데이터를 접어서 중복을 제거하기 때문에 실제 결과는 100개 미만이었습니다.

    이 경우 중첩 쿼리를 사용하여 문제를 해결할 수 있으며, 이는 N+1 실행이 필요하고 느리게 로드될 수 있습니다.

    또는 여기를 보세요: https://my.oschina.net/flags/...

    MyBatis 콘텐츠를 보려면 http://mybatis.tk

    를 방문하세요.

    회신하다
    0
  • 扔个三星炸死你

    扔个三星炸死你2017-06-10 09:51:39

    으아악

    변경:

    으아악

    회신하다
    0
  • 曾经蜡笔没有小新

    曾经蜡笔没有小新2017-06-10 09:51:39

    서브 쿼리를 사용해도 문제 없습니다

    으아악

    저자는 Mybatis-PageHelpercount SQL 변환 구현

    을 살펴볼 수 있습니다.

    Paging을 구현하려면 작성자가 직접 Mybatis-PageHelper를 사용하는 것이 좋습니다

    회신하다
    0
  • 취소회신하다