0

嗨,我有 3 个表的数据库员工:

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 语句以使用person.lastName从department.dept_name获取数据。我已经使用以下代码来提取此数据,但没有运气:

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

人.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>();**

部门.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;

4

2 回答 2

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();

感谢hibernate,您不需要关心连接表。让我知道它是否不起作用

于 2013-04-16T09:59:43.453 回答
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 关联的默认值,并且 cascade = ALL 对于多对多关联没有多大意义。

那么您必须了解 HQL 使用实体和属性名称,而不是表和列名称。您还必须意识到,如果您选择部门名称,您将获得部门名称列表,而不是人员列表。

因此,如果您想获取给定部门名称的人员列表,您应该使用

select distinct p from Person p
join p.departmentList d 
where d.name = :departmentName
于 2013-04-16T10:03:34.447 回答