2014-06-18 21 views

Trả lời

3

Bạn có thể làm tìm nạp bài đăng này.

Nhận danh sách tất cả các câu hỏi và chỉ nhận các câu hỏi ngẫu nhiên từ những câu hỏi đó.

public List<Question> getRandomQuestions(List<Questions> questions, int numberOfQuestions) { 
    List<Question> randomQuestions = new ArrayList<>(); 
    List<Question> copy = new ArrayList<>(questions); 

    SecureRandom rand = new SecureRandom(); 
    for (int i = 0; i < Math.min(numberOfQuestions, questions.size()); i++) { 
     randomQuestions.add(copy.remove(rand.nextInt(copy.size())); 
    } 

    return randomQuestions; 
} 

Hoặc nếu danh sách của bạn thực sự lớn và bạn biết ID trước, bạn có thể làm tương tự và chỉ cần tìm Id câu hỏi bạn cần.

0

AFAIK không có hỗ trợ cho điều này trong Dữ liệu mùa xuân. IMHO, hành động tốt nhất của bạn là tạo truy vấn gốc, ví dụ: @Query(nativeQuery=true, value="SELECT * FROM question ORDER BY random() LIMIT 10") bằng cách sử dụng phương thức phân loại gốc của phương phápcủa PostgreSQL hoặc một số phương thức tương đương trong DB của bạn.

5

Sự cố với select que from Question que order by RAND() là DB của bạn sẽ đặt hàng tất cả các bản ghi trước khi trả lại một mục. Vì vậy, nó đắt tiền trong bộ dữ liệu lớn.

Một cách rẻ hơn để đạt được mục tiêu này bao gồm hai bước:

  1. Tìm tổng số hồ sơ từ nơi bạn sẽ chọn một.
  2. Nhận một mục ngẫu nhiên trong tập hợp này.

Để làm điều đó trong MySql ví dụ, bạn có thể làm:

select count(*) from question; 

// using any programming language, choose a random number between 0 and count-1 (let's save this number in rdn), and finally 

select * from question LIMIT $rdn, 1; 

Ok, nhưng để làm được điều đó trong dữ liệu mùa xuân, bạn cần tạo một số truy vấn nguồn gốc ...

May mắn thay, chúng tôi có thể sử dụng phân trang để giải quyết điều đó. Trong giao diện Repository của bạn, tạo ra các phương pháp (một số kho có điều này mà không cần phải xác định nó):

Long count(); 
Page<Question> findAll(Pageable pageable); 

Và trong dịch vụ của bạn, bạn có thể sử dụng kho lưu trữ của bạn theo cách sau:

public Question randomQuestion() { 
    Long qty = questionRepository.countAll(); 
    int idx = (int)(Math.random() * qty); 
    Page<Question> questionPage = questionRepository.findAll(new PageRequest(idx, 1)); 
    Question q = null; 
    if (questionPage.hasContent()) { 
     q = questionPage.getContent().get(0); 
    } 
    return q; 
} 
+0

Đây là một trong của những câu trả lời hoàn hảo, nơi (a) nó * chính xác * những gì tôi cần và (b) Google và tôi đã không thể tìm thấy bất cứ điều gì khác từ xa gần. Nhưng tôi nghĩ rằng bạn có một lỗi đánh máy: không nên "countAll()" là "count()"? – fivedogit

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