2014-12-14 5 views
4

Как я могу присоединиться к двум таблицам с помощью HQL?Присоединиться к двум таблицам HQL-запрос

Во-первых, здесь мой SQL создать запрос для двух таблиц:

CREATE TABLE `subject` (
    `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, 
    `name` VARCHAR(50) NOT NULL, 
    PRIMARY KEY (`id`) 
) 

CREATE TABLE `employee` (
    `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, 
    `subject_id` INT(11) UNSIGNED NOT NULL, 
    `surname` VARCHAR(50) NOT NULL, 
    PRIMARY KEY (`id`), 
    INDEX `FK_employee_subject` (`subject_id`), 
    CONSTRAINT `FK_employee_subject` FOREIGN KEY (`subject_id`) REFERENCES `subject` (`id`) ON UPDATE CASCADE ON DELETE CASCADE 
) 

Я использую Netbeans и вот мои сгенерированные объекты.

Предмет объект:

@Entity 
@Table(name = "subject", catalog = "university") 
public class Subject implements java.io.Serializable { 

    private Integer id; 
    private String name; 
    private Set<Employee> employees = new HashSet<Employee>(0); 
    private Set<Report> reports = new HashSet<Report>(0); 

    public Subject() { 
    } 

    public Subject(String name) { 
     this.name = name; 
    } 

    public Subject(String name, Set<Employee> employees, Set<Report> reports) { 
     this.name = name; 
     this.employees = employees; 
     this.reports = reports; 
    } 

    @Id 
    @GeneratedValue(strategy = IDENTITY) 

    @Column(name = "id", unique = true, nullable = false) 
    public Integer getId() { 
     return this.id; 
    } 

    public void setId(Integer id) { 
     this.id = id; 
    } 

    @Column(name = "name", nullable = false, length = 50) 
    public String getName() { 
     return this.name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "subject") 
    public Set<Employee> getEmployees() { 
     return this.employees; 
    } 

    public void setEmployees(Set<Employee> employees) { 
     this.employees = employees; 
    } 

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "subject") 
    public Set<Report> getReports() { 
     return this.reports; 
    } 

    public void setReports(Set<Report> reports) { 
     this.reports = reports; 
    } 

} 

Сотрудник лицо:

@Entity 
@Table(name = "employee", catalog = "university") 
public class Employee implements java.io.Serializable { 

    private Integer id; 
    private Subject subject; 
    private String surname; 
    private Set<Report> reports = new HashSet<Report>(0); 

    public Employee() { 
    } 

    public Employee(Subject subject, String surname) { 
     this.subject = subject; 
     this.surname = surname; 
    } 

    public Employee(Subject subject, String surname, Set<Report> reports) { 
     this.subject = subject; 
     this.surname = surname; 
     this.reports = reports; 
    } 

    @Id 
    @GeneratedValue(strategy = IDENTITY) 

    @Column(name = "id", unique = true, nullable = false) 
    public Integer getId() { 
     return this.id; 
    } 

    public void setId(Integer id) { 
     this.id = id; 
    } 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "subject_id", nullable = false) 
    public Subject getSubject() { 
     return this.subject; 
    } 

    public void setSubject(Subject subject) { 
     this.subject = subject; 
    } 

    @Column(name = "surname", nullable = false, length = 50) 
    public String getSurname() { 
     return this.surname; 
    } 

    public void setSurname(String surname) { 
     this.surname = surname; 
    } 

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "employee") 
    public Set<Report> getReports() { 
     return this.reports; 
    } 

    public void setReports(Set<Report> reports) { 
     this.reports = reports; 
    } 

} 

Я пытался использовать запрос, как это, но он не работает:

select employee.id, employee.surname, subject.name from Employee employee, Subject subject where employee.subject_id=subject.id 

Вот my stacktrace, после использования предложенного запроса

org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: by near line 1, column 102 [select employee.id, employee.surname, subject.name from by.bsuir.yegoretsky.model.Employee employee, by.bsuir.yegoretsky.model.Subject subject where employee.subject_id=subject.id] 
    at org.hibernate.hql.internal.ast.QuerySyntaxException.convert(QuerySyntaxException.java:91) 
    at org.hibernate.hql.internal.ast.ErrorCounter.throwQueryException(ErrorCounter.java:109) 
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:304) 
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:203) 
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:158) 
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:126) 
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:88) 
    at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:190) 
    at org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:301) 
    at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:236) 
    at org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1796) 

И screenshoot: error

ответ

7

HQL использует имена сущностей и имена объект недвижимости. Никогда не имена таблиц или столбцов. В объекте нет subject_id. Employee.

Предлагаю вам ознакомиться с документацией о HQL, и особенно о joins and associations.

Запрос вам нужно

select employee.id, employee.surname, subject.name from Employee employee 
join employee.subject subject 
+0

Это именно то, что я искал. Спасибо. – DieZZzz

+0

Как вы можете выполнять итерацию –

1

Надеется, что это может работать

String hql = "from Subject as subject, Employee as emp"; 

List<?> list = session.createQuery(hql).list(); 

for(int i=0; i<list.size(); i++) { 
    Object[] row = (Object[]) list.get(i); 
    Subject subject= (Subject)row[0]; 
    Employee employee = (Employee)row[1]; 
}