Как конвертировать MySQL-запрос в HQL-запрос? - PullRequest
1 голос
/ 22 сентября 2010

Я новичок в HQL.Это MySQL Query.Мне нужно преобразовать его в HQL-запрос.Как это сделать, какие-либо предложения, пожалуйста?

    `SELECT STUDENT.ID, STUDENT.NAME, STUDENT.GRADE_ID, STUDENT.CLASS, GRADE.NAME FROM
     STUDENT INNER JOIN GRADE ON STUDENT.GRADE_ID = GRADE.GRADE_ID`

STUDENT [ID, NAME, GRADE_ID, CLASS]

GRADE [GRADE_ID, GRADE_NAME]

Результатом вышеупомянутого запроса будет что-то вроде ID, NAME, GRADE_NAME, CLASS.


Окончательное обновление:

У меня есть 2 таблицы STUDENT[ID, NAME, GRADE_ID, CLASS] GRADE[GRADE_ID, GRADE_NAME]

С SQL-запросом SELECT STUDENT.ID, STUDENT.NAME, STUDENT.GRADE_ID, STUDENT.CLASS, GRADE.NAME FROM STUDENT INNER JOIN GRADE ON STUDENT.GRADE_ID = GRADE.GRADE_ID Я использовал, чтобы показать, что Новая таблица STUDENT[ID, NAME, GRADE_NAME, CLASS] работает в SQL.Для этой функции нет ввода, тип возвращаемого значения - список (все записи таблицы результатов)

Это то, что я хочу сделать в HQL or JPQL, Как получить список объектов, где, СвойстваОбъекта были id, name, gradename, class.

Как это сделать с HQL.

Ответы [ 2 ]

3 голосов
/ 22 сентября 2010

Вы бы не делали этого в Hibernate.Весь смысл использования hibernate заключается в том, что вы имеете дело с объектами.

Так что я думаю, что ваш класс Student будет иметь список типа Grade

@Entity
public class Student{
    // accessors and id omitted
    @OneToMany(mappedBy="student")
    private List<Grade> grades;
}

@Entity
public class Grade{
    // accessors and id omitted
    @ManyToOne
    private Student student;
}

Вы будете искать оценку с помощью session.get () и затем grade.getStudent() для доступа к ученику:

Grade grade = (Grade) session.get(Grade.class, gradeId);
Student student = grade.getStudent();

HQL-запросы предназначены для сценариев, которые слишком сложны для этих методов поиска.

Редактировать: я только что понял, что вопрос помечен jpa.Тогда, конечно, вы будете использовать не HQL, а JPQL.А также вы будете использовать этот код:

Grade grade = entityManager.find(Grade.class, gradeId); // no cast needed with JPA 2
Student student = grade.getStudent();

Изменить: учитывая требования, которые вы добавили в свои комментарии, я бы изменил модель данных на что-то вроде этого (идентификаторы опущены):

@Entity
public class Student{
    public List<Course> getCourses(){
        return courses;
    }
    public void setCourses(List<Course> courses){
        this.courses = courses;
    }
    @OneToMany(mappedBy="student")
    private List<Course> courses;
}

@Entity
public class Course{
    @ManyToOne(optional=false)
    private Student student;
    @ManyToOne(optional=false)
    private Grade grade;
    public void setStudent(Student student){
        this.student = student;
    }
    public Student getStudent(){
        return student;
    }
    public Grade getGrade(){
        return grade;
    }
    public void setGrade(Grade grade){
        this.grade = grade;
    }
}

@Entity
public class Grade{
    @OneToMany(mappedBy="grade")
    private Set<Course> courses;
    public void setCourses(Set<Course> courses){
        this.courses = courses;
    }
    public Set<Course> getCourses(){
        return courses;
    }
}

И я бы спросил так:

Grade grade = entityManager.find(Grade.class, 1L);
List<Student> studentsWithThisGrade = new ArrayList<Student>();
for(Course course : grade.getCourses()){
    studentsWithThisGrade.add(course.getStudent());
}

(Но Grade, вероятно, должен быть не сущностью, а числовым значением или перечислением.)


Оказывается, в конце концов OP использует обычный режим гибернации, а не JPA.Поэтому всякий раз, когда вы видите entityManager.find() выше, замените это в своем уме на session.get(): -)

0 голосов
/ 22 сентября 2010

Попробуйте это.

public List<Student> getByGradeId(EntityManager entityManager, Grade grade) {
   Query query = entityManager.createQuery("from Student where grade=:grade");
   query.setParameter("grade", grade);
   return (List<Student>) query.getResultList();
}

Вам тоже понадобится попробовать / поймать.

Прочтите раздел 3.4 этого !

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...