2012-03-30 36 views
5

Tôi đang sử dụng giao diện Spring JdbcTemplate để tìm nạp dữ liệu từ một MS SqlServer DB. Trong tài liệu tôi thấy có phương pháp setMaxRows() để đặt giới hạn cho tất cả các truy vấn, nhưng nếu tôi muốn giới hạn chỉ một lựa chọn thì sao?Spring JdbcTemplate: cách giới hạn các hàng đã chọn?

Có cách nào để đặt giới hạn chỉ cho truy vấn được gọi cụ thể theo cách "có thể định cấu hình" không?

+0

Điều gì về việc sử dụng PreparedStatementCreator của riêng bạn cho những câu lệnh đó và gọi Statement.setMaxRows() khi tạo câu lệnh đã chuẩn bị? –

+0

@a_horse_with_no_name mà có vẻ là một ý tưởng tuyệt vời, bạn có thể cung cấp cho tôi một số ví dụ về cách sử dụng 'PreparedStatementCreator', tôi mới làm quen với Spring ... – davioooh

+1

Tôi mới làm quen với Spring, nếu không tôi sẽ thêm câu trả lời bằng ví dụ:) –

Trả lời

2

Giới hạn tập hợp kết quả của một truy vấn cụ thể có thể được thực hiện bằng cách đặt giới hạn trực tiếp vào truy vấn. Tham khảo tài liệu nhà cung cấp DB của bạn để xem liệu nó có hỗ trợ ví dụ LIMIT hay không.

Ví dụ về MySQL: SELECT * FROM EMPLOYEE LIMIT 10

+0

Hoặc 'SELECT * FROM EMPLOYEE WHERE ROWNUM <10' trong trường hợp của Oracle. – adarshr

+0

@jabal có, tôi biết, nhưng trong phương pháp triển khai của tôi, giới hạn là tùy chọn, vì vậy, nếu bạn phải giới hạn truy vấn trực tiếp bằng SQL, bạn phải viết hai truy vấn khác nhau ... – davioooh

+0

Trong trường hợp này tôi thường xây dựng chuỗi truy vấn trong mã của tôi xử lý các trường hợp "giới hạn hoặc không giới hạn" khác nhau và sau đó thực thi nó. Tôi không biết một giải pháp tốt hơn, tò mò nếu ai đó làm .. :-) – jabal

4

Một số SQL dựa ngôn ngữ truy vấn (derby) không hỗ trợ LIMIT từ khóa. Vì vậy, bạn không thể sử dụng LIMIT trong truy vấn trực tiếp. Sử dụng Spring JDBC Template chúng ta có thể thiết lập số lượng tối đa hàng cần thông qua setMaxRows(Integer intvalue)

jdbcTemplate.setMaxRows(1); 
1

Bạn cũng có thể sử dụng giới hạn từ khóa trong câu truy vấn. xem dưới đây truy vấn

select * from FileShare limit 3 offset 3 

nếu trong giới hạn ứng dụng của bạn và bù đắp có thể được gán tự động bởi người dùng sử dụng dưới đây truy vấn

@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}); 

} 

Đây FileShare là một tên bảng và SharedFilesRowMapper là rowMapper mà danh sách các hàng từ bảng.

Các vấn đề liên quan