2012-03-30 10 views
5

Używam interfejsu Spring JdbcTemplate do pobierania danych z MS SqlServer DB. W dokumentacji widzę, że jest metoda setMaxRows() ustalania limitu dla wszystkich zapytań, ale co jeśli chcę ograniczyć tylko wybór?Spring JdbcTemplate: jak ograniczyć wybrane wiersze?

Czy istnieje sposób ustawienia limitu tylko dla określonego wywoływanego zapytania w "konfigurowalny" sposób?

+0

Co powiesz na używanie własnego PreparedStatementCreator dla tych instrukcji i wywołanie Statement.setMaxRows() podczas tworzenia przygotowanej instrukcji? –

+0

@a_horse_with_no_name, co wydaje się świetnym pomysłem, czy możesz podać mi przykład użycia 'PreparedStatementCreator', jestem nowy w Spring ... – davioooh

+1

Jestem nowy w Spring, w przeciwnym razie dodałem odpowiedź na przykładzie:) –

Odpowiedz

2

Ograniczenie zestawu wyników określonego zapytania można wykonać, umieszczając limit bezpośrednio w zapytaniu. Skonsultuj się z dokumentacją dostawcy DB, aby sprawdzić, czy obsługuje on na przykład LIMIT.

Przykład na MySQL: SELECT * FROM EMPLOYEE LIMIT 10

+0

Lub 'WYBIERZ * Z PRACOWNIKA GDZIE ROWNUM <10' w przypadku Oracle. – adarshr

+0

@jabal tak, wiem, ale w mojej implementacji metody limit jest opcjonalny, więc jeśli musisz ograniczyć zapytanie bezpośrednio za pomocą SQL, musisz napisać dwa różne zapytania ... – davioooh

+0

W takich przypadkach zazwyczaj buduję ciąg zapytania w moim kodzie obsługujący różne przypadki "limit lub no-limit", a następnie go wykonuj. Nie znam lepszego rozwiązania, ciekaw, czy ktoś to robi. :-) – jabal

4

Niektóre SQL na podstawie zapytań języki (Derby) nie obsługuje LIMIT słowa kluczowego. Więc nie możesz użyć LIMIT bezpośrednio w zapytaniu. Korzystanie z wiosny JDBC Template możemy ustawić maksymalną liczbę wierszy wymaganych przez setMaxRows(Integer intvalue)

jdbcTemplate.setMaxRows(1); 
1

Można też użytkownik limitu słów kluczowych w zapytaniu. patrz poniżej zapytania

select * from FileShare limit 3 offset 3 

jeśli w granicach wniosku i offset można przypisać dynamicznie przez użytkownika użycie poniżej zapytania

@Autowired 
private JdbcTemplate template; 

public JdbcTemplate getTemplate() { 
    return HibernateUtil.getJdbcTemplate(); 
} 

public List<FileShare> getAllSharedFiless(int limit,int offset) 
      throws ShareMeException { 
String query="select * from FileShare limit ? offset ?"; 
     return getTemplate().query(query, 
       new SharedFilesRowMapper(), 
       new Object[]{limit,offset}); 

} 

Tutaj FileShare to nazwa tabeli i SharedFilesRowMapper jest rowMapper jakiej liście wiersze z tabeli.

Powiązane problemy