HQL: Can't resolve symbol

86
17 марта 2021, 15:30

Подскажите пожалуйста, какой синтаксис у HQL запроса, который возвращал бы объекты из базы, при определённом условии.

List<Answer> answers = HibernateSessionFactoryUtil.getSessionFactory().openSession()
                    .createQuery("From com.quiz2.models.Answer answ WHERE answ.question_id = " + :id).list();
return answers;

Код на снимке:

То есть, я хочу вывести все Answers, которые связаны с определённым Question (один question ко многим answers).

Класс ответов:

package com.quiz2.models;
import javax.persistence.*;
@Entity
@Table(name = "answers")
public class Answer {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    @Column(name = "text_answer")
    private String text_answer;
    @Column(name = "correct")
    private boolean correct;
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "question_id")
    private Question question;
    public Answer() {
    }
    public Answer(String text_answer) {
        this.text_answer = text_answer;
    }
    public int getId() {
        return id;
    }
    public String getText_answer() {
        return text_answer;
    }
    public void setText_answer(String text_answer) {
        this.text_answer = text_answer;
    }
    public boolean isCorrect() {
        return correct;
    }
    public void setCorrect(boolean correct) {
        this.correct = correct;
    }
    public Question getQuestion() {
        return question;
    }
    public void setQuestion(Question question) {
        this.question = question;
    }
    @Override
    public String toString() {
        return "ID " + getId() + " Answer " + getText_answer() + " correct: " + isCorrect();
    }
}

Класс вопросов:

package com.quiz2.models;
import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;
@Entity
@Table(name = "questions")
public class Question {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    @Column(name = "text_question")
    private String text_question;
    @Column(name = "score")
    private int score;
    @OneToMany(mappedBy = "question", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<Answer> answers;
    public Question() {
    }
    public Question(String text_question, int score) {
        this.text_question = text_question;
        this.score = score;
        this.answers = new ArrayList<Answer>();
    }
    public void addAnswer(Answer answer, boolean correct) {
        answer.setCorrect(correct);
        answer.setQuestion(this);
        answers.add(answer);
    }
    public void removeAnswer(Answer answer) {
        answers.remove(answer);
    }
    public int getId() {
        return id;
    }
    public String getText_question() {
        return text_question;
    }
    public void setText_question(String text_question) {
        this.text_question = text_question;
    }
    public int getScore() {
        return score;
    }
    public void setScore(int score) {
        this.score = score;
    }
    public List<Answer> getAnswers() {
        return answers;
    }
    public void setAnswers(List<Answer> answers) {
        this.answers = answers;
    }
    @Override
    public String toString() {
        return "Question: " + getText_question();
    }
}

Я могу просто получить все объекты Answer вот так: .createQuery(From Answer) и методами Java получить нужные, обычным сравнением. Но нужно же сделать правильно.

Answer 1

Не видя класс сущности, нельзя дать ответ. Кроме той проблемы, которую подсвечивает вам IDE, ещё в глаза сразу бросается, что у вас в запросе есть placeholder для id, но вы не передаёте значение для него. Вероятно, рабочий код должен выглядеть так:

Session session = HibernateSessionFactoryUtil.getSessionFactory().openSession();
String hql = "SELECT a FROM com.quiz2.models.Answer WHERE a.question = :question";
Query<Answer> query = session.createQuery(hql, Answer.class);
query.setParameter("question", someQuestionObject);
List<Answer> answers = query.list();

P.S. Подумайте об использовании JPA.

READ ALSO
Сортировка Comparator по String и int

Сортировка Comparator по String и int

Нужно, чтобы компаратор отсортировал массив по Типу(Type) и Цене(Price)

111
Падает deploy через jenkins - ERROR: Exception when publishing, exception message [Exec exit status not zero. Status [1]]

Падает deploy через jenkins - ERROR: Exception when publishing, exception message [Exec exit status not zero. Status [1]]

Скорее всего проблема WildflyЛог jenkins с настройками:

202
Как открыть файл с базой данных , закрытой паролем

Как открыть файл с базой данных , закрытой паролем

есть файл который содержит базу данных- он создаётся кодом с#, но есть загвоздка в том, что он с паролемВот строка подключения от автора проги...

117
Как сделать слияние двух списков с последующей сортировкой?

Как сделать слияние двух списков с последующей сортировкой?

Даны два спискаНеобходимо слить два списка в один, отсортировать по убыванию и вывести

81