嗨, 我有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
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 :(得分: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,你不需要关心连接表。 如果它不起作用,请告诉我
答案 1 :(得分: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