Вывод объектов из базы в случайном порядке и без повтора

96
01 февраля 2021, 06:40

Необходимо реализовать web приложение с голосованием используя spring. Кандидаты загружаются в базу данных через специальную форму. При запуске голосования выводится пара кандидатов и так пока не закончатся все участники. Они не должны повторяться и обязаны появляться в случайном порядке для каждого пользователя. В конце выводится топ по результатам голосования всех пользователей. В данный момент кандидаты повторяются и нельзя загрузить меньше или больше 10 участников, проблему не могу решить уже несколько дней, решил обратиться сюда.

Контроллер голосования:

@Controller
@RequestMapping("/votePage")
public class VoteController {
@Autowired
CatRepo catRepo;
@Autowired
ListService service;
@RequestMapping("/vote1")
public String votePageOne(Model model) {
    model.addAttribute("cat1", service.listAll().get(0));
    model.addAttribute("cat2", service.listAll().get(1));
    return "vote1";
}
@RequestMapping("/voteFor1")
public String voteForOne(@RequestParam Long id) {
    Cat cat = catRepo.findById((long) id);
    cat.setCount(cat.getCount() + 1);
    catRepo.save(cat);
    return "redirect:/votePage/vote2";
}
@RequestMapping("/vote2")
public String votePageTwo(Model model) {
    model.addAttribute("cat3", service.listAll().get(2));
    model.addAttribute("cat4", service.listAll().get(3));
    return "vote2";
}
@RequestMapping("/voteFor2")
public String voteForTwo(@RequestParam Long id) {
    Cat cat = catRepo.findById((long) id);
    cat.setCount(cat.getCount() + 1);
    catRepo.save(cat);
    return "redirect:/votePage/vote3";
}
@RequestMapping("/vote3")
public String votePageThree(Model model) {
    model.addAttribute("cat5", service.listAll().get(4));
    model.addAttribute("cat6", service.listAll().get(5));
    return "vote3";
}
@RequestMapping("/voteFor3")
public String voteForThree(@RequestParam Long id) {
    Cat cat = catRepo.findById((long) id);
    cat.setCount(cat.getCount() + 1);
    catRepo.save(cat);
    return "redirect:/votePage/vote4";
}
@RequestMapping("/vote4")
public String votePageFour(Model model) {
    model.addAttribute("cat7", service.listAll().get(6));
    model.addAttribute("cat8", service.listAll().get(7));
    return "vote4";
}
@RequestMapping("/voteFor4")
public String voteForFour(@RequestParam Long id) {
    Cat cat = catRepo.findById((long) id);
    cat.setCount(cat.getCount() + 1);
    catRepo.save(cat);
    return "redirect:/votePage/vote5";
}
@RequestMapping("/vote5")
public String votePageFive(Model model) {
    model.addAttribute("cat9", service.listAll().get(8));
    model.addAttribute("cat10", service.listAll().get(9));
    return "vote5";
}
@RequestMapping("/voteFor5")
public String voteForFive(@RequestParam Long id) {
    Cat cat = catRepo.findById((long) id);
    cat.setCount(cat.getCount() + 1);
    catRepo.save(cat);
    return "redirect:/votePage/result";
}
@RequestMapping("/result")
public String result(Model model) {
    List<Integer> numbers = new ArrayList<>();
    for (int i = 0; i < numbers.size(); i++) {
        numbers.add(i);
    }
    model.addAttribute("cats", service.sortList());
    model.addAttribute("numbers", numbers);
    return "result";
}
}

Модель:

@Entity
@Data
@Table(name = "cats")
public class Cat implements Serializable, Comparable<Cat> {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;
private Integer count;
private String filename;
public Cat() { }
public Cat(String name) {
    this.name = name;
}
@Override
public int compareTo(Cat that) {
    return Long.compare(this.count, that.count);
}
}

Сервис:

@Service
public class ListService {
@Autowired
CatRepo catRepo;
public List<Cat> sortList() {
    return StreamSupport
            .stream(
                    Spliterators.spliteratorUnknownSize(catRepo.findAll().iterator(), Spliterator.NONNULL),
                    false)
            .sorted(Comparator.reverseOrder())
            .collect(Collectors.toList());
}
public List<Cat> listAll() {
    List<Cat> cats = new ArrayList<>();
    catRepo.findAll().forEach(cats::add);
    Collections.shuffle(cats);
    return cats;
}
}

Контроллер добавления кандидатов:

@Controller
@RequestMapping("/add")
public class AddController {
@Autowired
CatRepo catRepo;
@Value("${upload.path}")
private String uploadPath;
@GetMapping("/addCandidate")
public String getAdd() {
    return "upload";
}
@PostMapping("/addCandidate")
public String add(
        @RequestParam String name,
        @RequestParam("file") MultipartFile file,
        Model model
) throws IOException {
    Cat cat = new Cat(name);
    if (file != null && !file.getOriginalFilename().isEmpty()) {
        File uploadDir = new File(uploadPath);
        if (!uploadDir.exists()) {
            uploadDir.mkdir();
        }
        String uuidFile = UUID.randomUUID().toString();
        String resultFilename = uuidFile + "." + file.getOriginalFilename();
        file.transferTo(new File(uploadPath + "/" + resultFilename));
        cat.setFilename(resultFilename);
    }
    catRepo.save(cat);
    return "upload";
}
}
READ ALSO
Не работает метод onBackPressed Android

Не работает метод onBackPressed Android

Есть проект "написанный" в Buildbox и импортированный в Android StudioВ самой студии была создана Activity с кнопкой, при нажатии на которую открывается...

120
Как &#171;Поставить на паузу&#187; процесс чужой программы

Как «Поставить на паузу» процесс чужой программы

Мне нужен метод, который бы остановил программу на неопределенный или определенный срок(Заморозить), подобно методу Threadsleep() , только у чужой...

115