使用外键在 2 个表之间进行 Hibernate Join
Hibernate Join between 2 tables with foreign key
我试图获取包含两个 table 的连接结果的列表,但总是出错。
我想要的是包含人员和工作名称的列表
错误
- 无法调用“org.hibernate.hql.internal.ast.tree.FromElement.setAllPropertyFetch(布尔值)”,因为“fromElement”为空
我的tables
- 人
- int id
- 文本名称
- int job_id(带 table JOB(id) 的外键)
- 工作
- int id
- 文本名称
实体
@Entity
@Table(name = "person")
public class Person{
@Id
@Column(name = "id")
int id;
@Column(name = "name")
String name;
@Column(name = "job_id")
int jobId;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getJobId() {
return jobId;
}
public void setJobId(int jobd) {
this.jobId= jobId;
}
public String getName() {
return name;
}
public void setName(int name) {
this.name= name;
}
@Entity
@Table(name = "job")
public class Job{
@Id
@Column(name = "id")
int id;
@Column(name = "name")
String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(int name) {
this.name= name;
}
- DAO
public class PersonDAO {
@Autowired
private SessionFactory sessionFactory;
public void setSessionFactory(SessionFactory sf) {
this.sessionFactory = sf;
}
public List<Person> getAllPerson() {
Session session = this.sessionFactory.getCurrentSession();
List<PersonResponse> list = session.createQuery("from Person p left join p.jobId").list();
}
}
- PersonResponse
- POJO with Person parameteres/variables without annotations and job name.
为了能够在 hql 中使用 left join
,您应该按以下方式更正 Person
的映射:
@Entity
@Table(name = "person")
public class Person
{
@ManyToOne
@JoinColumn(name = "job_id")
Job job;
// ...
}
然后你就可以这样写hql查询了:
List<Person> list = session.createQuery("select p from Person p left join p.job").list();
我试图获取包含两个 table 的连接结果的列表,但总是出错。 我想要的是包含人员和工作名称的列表
错误
- 无法调用“org.hibernate.hql.internal.ast.tree.FromElement.setAllPropertyFetch(布尔值)”,因为“fromElement”为空
我的tables
- 人
- int id
- 文本名称
- int job_id(带 table JOB(id) 的外键)
- 工作
- int id
- 文本名称
- 人
实体
@Entity @Table(name = "person") public class Person{ @Id @Column(name = "id") int id; @Column(name = "name") String name; @Column(name = "job_id") int jobId; public int getId() { return id; } public void setId(int id) { this.id = id; } public int getJobId() { return jobId; } public void setJobId(int jobd) { this.jobId= jobId; } public String getName() { return name; } public void setName(int name) { this.name= name; } @Entity @Table(name = "job") public class Job{ @Id @Column(name = "id") int id; @Column(name = "name") String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(int name) { this.name= name; }
- DAO
public class PersonDAO { @Autowired private SessionFactory sessionFactory; public void setSessionFactory(SessionFactory sf) { this.sessionFactory = sf; } public List<Person> getAllPerson() { Session session = this.sessionFactory.getCurrentSession(); List<PersonResponse> list = session.createQuery("from Person p left join p.jobId").list(); } } - PersonResponse - POJO with Person parameteres/variables without annotations and job name.
为了能够在 hql 中使用 left join
,您应该按以下方式更正 Person
的映射:
@Entity
@Table(name = "person")
public class Person
{
@ManyToOne
@JoinColumn(name = "job_id")
Job job;
// ...
}
然后你就可以这样写hql查询了:
List<Person> list = session.createQuery("select p from Person p left join p.job").list();