#sql #spring #hibernate #jpa #spring-data-jpa
#sql #spring #переход в спящий режим #jpa #spring-data-jpa
Вопрос:
У меня есть две таблицы :
Таблица вопросов, в которой содержится :
И тогда у меня есть другая таблица, которая называется
Пользовательский ответ на вопрос, содержащий :
В котором есть ссылка на вопрос через question_id
Дело в том, что каждый раз, когда пользователь отвечает на вопрос, я создаю строку в БД, в которой говорится :
идентификатор вопроса_id_пользователя ответил на него, а затем я проверяю, правильный ответ или нет, если он правильный, я помещаю passed как True, в противном случае я помещаю passed как false.
Хорошо, с этого момента все в порядке, единственное, чего я не могу получить, это то, что я создаю метод, который возвращает мне следующий вопрос без ответа, но я не могу правильно использовать этот метод.
Что я хотел бы, так это иметь запрос, который сначала возвращает все вопросы, на которые пользователь еще не ответил, а затем другой запрос, который возвращает только вопрос, на который пользователь еще не ответил.
Примечание: Этот показанный атрибут был добавлен, потому что я хочу сначала выполнить итерацию по другим вопросам вместо отображения тех, которые пользователь недавно не смог выполнить.
Ясен ли вопрос?
Что я пробовал?
Я пытался получить вопросы List<UserAnswerQuestion> findAllByUserEmailAndPassedFalseAndShownFalse(String email);
, но это не работает, потому что с помощью этой таблицы я могу знать каждый ответ при каждой попытке пользователя, так что, например, если у меня есть вопрос, на который есть 4 ответа и 1 правильный, эта таблица может содержать 4 строки с одинаковым question_question_id, потому что пользователь, возможно, потерпел неудачу 3 раза, а затем на четвертый он отвечает правильно.
Редактировать
У меня уже есть вопросы, на которые пользователь может ответить с помощью этого метода :
public List<Question> getAllQuestionsThatUserCanAnswer(String email, Long topic){
List<Question> mList = this.questionRepository.findAllByTopicParentId(topic);
if(mList==null) return null;
List<UserAnswerQuestion> userAnswerQuestionList = this.userAnswerQuestionRepository.findAllByUserEmail(email);
for (UserAnswerQuestion userAnswerQuestion : userAnswerQuestionList) {
if(mList.contains(userAnswerQuestion.getQuestion())){
if(userAnswerQuestion.getPassed()){
mList.remove(userAnswerQuestion.getQuestion());
}
}
}
return mList;
}
Сейчас я пытаюсь выполнить GetNext этого метода, но я не знаю, как выполнить итерацию по нему.
Ответ №1:
Сосредоточьтесь на SQL-запросе, который решит вашу проблему
select * from Question q
left join Answer a on q.id = a.question_id
where a.id is null OR (a.passed != 'true' AND a.user_id = 1)
order by a.passed
Проверьте scratch здесь