2013-04-16 5 views
0

Привет, У меня есть базы данных Staff с 3 таблицами:Сочинение HQL заявление

mysql> describe person; 
+------------+--------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+------------+--------------+------+-----+---------+----------------+ 
| person_id | bigint(20) | NO | PRI | NULL | auto_increment | 
| date  | datetime  | YES |  | NULL |    | 
| first_name | varchar(255) | YES |  | NULL |    | 
| last_name | varchar(255) | YES |  | NULL |    | 
| position | varchar(255) | YES |  | NULL |    | 
| salary  | double  | YES |  | NULL |    | 
+------------+--------------+------+-----+---------+----------------+ 

mysql> describe department; 
+---------------+--------------+------+-----+---------+----------------+ 
| Field   | Type   | Null | Key | Default | Extra   | 
+---------------+--------------+------+-----+---------+----------------+ 
| department_id | bigint(20) | NO | PRI | NULL | auto_increment | 
| dept_name  | varchar(255) | YES |  | NULL |    | 
+---------------+--------------+------+-----+---------+----------------+ 

mysql> describe department_person; 
+---------------+------------+------+-----+---------+-------+ 
| Field   | Type  | Null | Key | Default | Extra | 
+---------------+------------+------+-----+---------+-------+ 
| department_id | bigint(20) | NO | PRI | NULL |  | 
| person_id  | bigint(20) | NO | PRI | NULL |  | 
+---------------+------------+------+-----+---------+-------+ 

И я хочу, чтобы составить заявление HQL для получения данных из department.dept_name с использованием person.lastName. Я использовал следующий код для извлечения этих данных, но не повезло:

public List<Person> findByDepartment(){ 
     Session session = 
       HiberUtil.getSessionFactory().getCurrentSession(); 
     session.beginTransaction(); 
     List<Person> result = session.createQuery("select d.dept_name from Person p " + 
      "join p.Department d where p.id = 'Andreas'").list(); 
     for(Person a : result) { 
      Hibernate.initialize(a.getDepartmentList()); 
     } 
     session.getTransaction().commit(); 
     return result; 

    } 

Помогите пожалуйста запросить правильное составление запроса HQL?

UPD

Person.java

**@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL) 
@JoinTable(name = "department_person", joinColumns = { 
     @JoinColumn(name = "person_id", nullable = false, updatable = false) }, 
     inverseJoinColumns = { @JoinColumn(name = "department_id", 
       nullable = false, updatable = false) }) 
private Set<Department> departmentList = new HashSet<Department>();** 

Department.java

@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL) 
    @JoinTable(name = "department_person", joinColumns = { 
      @JoinColumn(name = "department_id", nullable = false, updatable = false) }, 
      inverseJoinColumns = { @JoinColumn(name = "person_id", 
        nullable = false, updatable = false) }) 
    private Set<Person> personList; 

+0

ли ваши объекты отображаются с OneToMany, Oneto ... отношения? – DessDess

+0

, сопоставленный с ManyToMany, я обновил сообщение с фрагментами кода. – devger

+0

. Последний вопрос, который вы хотите, чтобы список лиц, использующих название отдела (как подсказывает ваше имя метода), или имя отдела для одного человека – DessDess

ответ

0

Этот запрос должен работать:

Query query = getSessionFactory().getCurrentSession().createQuery("SELECT d.personList FROM Department d WHERE d.departmentName = :departmentName"); 
query.setParameter("departmentName", departmentName); 
List<Person> resultList = query.getResultList(); 

Благодаря зимуют вам не нужно заботиться о присоединиться к столу. Сообщите мне, если он не работает

+0

Это помогло мне. Благодарю. – devger

0

Прежде всего, ваше отображение неверно. У вас здесь много-много двунаправленная связь, поэтому одна из сторон должна быть владельцем и определять сопоставление с помощью @JoinTable, а другая сторона должна быть обратной стороной и использовать атрибут mappedBy. Если вы хотите, чтобы человек, чтобы быть владельцем, отображение должно быть таким образом:

@ManyToMany 
@JoinTable(name = "department_person", 
      joinColumns = { @JoinColumn(name = "person_id") }, 
      inverseJoinColumns = { @JoinColumn(name = "department_id") }) 
private Set<Department> departmentList = new HashSet<Department>(); 

... 

@ManyToMany(mappedBy = "departmentList") 
private Set<Person> personList; 

Обратите внимание, что LAZY по умолчанию для toMany ассоциаций, а каскад = ALL не имеет большого смысла для многих многих ассоциаций.

Затем вы должны понимать, что HQL использует имена сущностей и атрибутов, а не имена таблиц и столбцов. Вы также должны понимать, что если вы выберете имена отделов, вы получите список названий отделов, а не список лиц.

Итак, если вы хотите, чтобы получить список лиц для данного имени depertment, вы должны использовать

select distinct p from Person p 
join p.departmentList d 
where d.name = :departmentName 
+0

JB Nizet, спасибо за ваше объяснение, я вернусь к нему, чтобы уйти в свободное время. – devger

Смежные вопросы