복붙노트

[SPRING] MyBatis RowBounds는 쿼리 결과를 제한하지 않습니다.

SPRING

MyBatis RowBounds는 쿼리 결과를 제한하지 않습니다.

페이지 매김을 지원해야하는 Stateless API를 개발 중입니다.

Oracle 데이터베이스를 사용합니다. 데이터베이스 액세스를 위해 MyBatis와 Spring을 사용합니다.

설명서에서 RowBounds 클래스를 사용하여 쿼리에서 반환하는 행 수를 제한 할 수 있음을 알고 있습니다.

그러나 페이지 최적화를 지원하는 쿼리에는 특별한 최적화가 수행되지 않은 것 같습니다.

예를 들어 RowBounds를 100 레코드 50 개로 설정하면 쿼리에 다음과 같이 추가해야합니다.

(original query with the where clause...)
and ROWNUM < 150
and ROWNUM >= 100

하지만 거기에는 아무 것도 없으며, 수동으로 정의한 쿼리 일뿐입니다.

몇 천 가지의 결과가있을 수 있기 때문에 성능면에서는 끔찍합니다.

내가 뭘 잘못하고 있죠?

감사.

해결법

  1. ==============================

    1.Mybatis는 사용중인 SQL 드라이버에 많은 것들을 남겨두고 있으며, aroundRowBounds가 그 중 하나입니다.

    Mybatis는 사용중인 SQL 드라이버에 많은 것들을 남겨두고 있으며, aroundRowBounds가 그 중 하나입니다.

    http://mybatis.github.io/mybatis-3/java-api.html을 참조하십시오.

    디폴트는 분명히 UNSET이지만, select 태그의 ResultSetType 속성으로 SCROLL_SENSITIVE를 사용하고 이것이 도움이되는지 확인할 수 있습니다. 자세한 정보는 http://mybatis.github.io/mybatis-3/sqlmap-xml.html을 참조하십시오.

    그래도 작동하지 않는다면 RowBounds의 사용을 피하고 select 태그가 parameterType으로 취할 수있는 SettingsBean 클래스 (또는 유사)를 구현하고 오프셋 및 제한 (또는 아마도) 필드를 포함하여 문제를 해결할 수 있습니다 rowStart와 rowEnd는 오라클에게 더 적합합니다. 그런 다음 필요에 따라 런타임에이를 설정하고 select가 실행될 때 SQL에 동적으로 삽입 할 수 있습니다.

    조금 더 많은 코드가 있지만 순수 동적 SQL을 통해 원하는대로 정확하게 동작을 제어 할 수 있습니다. 나는 Mybatis와 Postgres와 같은 접근 방식을 사용했으며 잘 작동했다.

    따라서 해당 필드와 getter 및 setter를 사용하여 SettingsBean 클래스를 구현하면 select 문은 다음과 같이 표시 될 수 있습니다.

    <select
      id="selectFoo"
      parameterType="com.foo.bar.SettingsBean">
    
    select *
    from foo
    where rownum >= #{rowStart}
      and rownum < #{rowEnd}
    </select>
    
  2. ==============================

    2.이 문제에 대한 간단한 해결책을 찾았습니다. @khampson이 권장하는 Mybatis 명령어를 따르고 제한을 두지 않고 매퍼에 RowBounds 인스턴스를 전달했습니다.

    이 문제에 대한 간단한 해결책을 찾았습니다. @khampson이 권장하는 Mybatis 명령어를 따르고 제한을 두지 않고 매퍼에 RowBounds 인스턴스를 전달했습니다.

    RowBounds rowbounds = new RowBounds(0, resultLimit);
    roster = tableMapper.selectAll(rowbounds);
    

    폴더 java

    public List<Row> selectAll(RowBounds rowbounds);
    

    폴더 xml

    <select id="com.TableMapper.selectAll" resultMap="row" timeout="10">
                SELECT * FROM table;
    </select>
    

    단순히 "LIMIT # {param1.offset}, # {param1.limit}"을 매퍼의 xml에 추가하면 원하는 동작이 생성되었습니다!

    <select id="com.TableMapper.selectAll" resultMap="row" timeout="10"> 
        SELECT * FROM table LIMIT #{param1.offset}, #{param1.limit}; 
    </select>
    
  3. ==============================

    3.나는 Postgres 데이터베이스와 AngularUI에서 페이지 매김을 테스트했다. 첫 번째 페이지는 N ° 1입니다. N ° 0 페이지를 호출하면 서비스에서 모든 데이터를 반환합니다.

    나는 Postgres 데이터베이스와 AngularUI에서 페이지 매김을 테스트했다. 첫 번째 페이지는 N ° 1입니다. N ° 0 페이지를 호출하면 서비스에서 모든 데이터를 반환합니다.

    자바 서비스 :

    public List<Foo> selectAll(int currentPage, int itemsPerPage);
        int offset = (currentPage - 1) * itemsPerPage;
        RowBounds rowbounds;
        if(currentPage == 0){
            rowBounds = new RowBounds();
        } else {
            rowBounds = new RowBounds(currentPage, itemsPerPage);
        }
        return fooMapper.selectAll(rowBounds);
    }
    

    자바 폴더 :

    public List<Foo> selectAll(RowBounds rowbounds);
    

    xml 폴더 :

    <select id="selectAll" resultMap="Foo">
        SELECT * FROM foo;
    </select>
    
  4. from https://stackoverflow.com/questions/24301787/mybatis-rowbounds-doesnt-limit-query-results by cc-by-sa and MIT license