[英]How to handle join query in Hibernate and Spring with annotations?
我正在使用Spring和Hibernate與MySQL開發應用程序。 我是Hibernate的新手並完成了基本任務......
現在我需要在select查詢中應用連接以使用注釋從多個表中獲取數據。 我已經搜索過了,但我仍然沒有想到......
這是我的數據庫表和bean類:
Table 1: 'employee_info' ( id, empid, empname, doj and jobtitle )
Table 2: 'employee_login' ( username, password, status and empid )
我的bean類是:
EmployeeInfoForm.java
@Entity()
@Table(name = "employee_info")
public class EmployeeInfoForm {
@Id
@GeneratedValue
@Column(name = "id", unique = true, nullable = true)
private int id;
@Column(name = "empId")
private int empId;
@Column(name = "empname")
private String empName;
@Column(name = "doj")
private Date empDoj;
@Column(name = "jobtitle")
private String empJobTitle;
public int getEmpId() {
return empId;
}
public void setEmpId(int empId) {
this.empId = empId;
}
public void setEmpDoj(Date empDoj) {
this.empDoj = empDoj;
}
public String getEmpName() {
return empName;
}
public void setEmpName(String empName) {
this.empName = empName;
}
public Date getEmpDoj() {
return empDoj;
}
public void setEmp_Doj(Date empDoj) {
this.empDoj = empDoj;
}
public String getEmpJobTitle() {
return empJobTitle;
}
public void setEmpJobTitle(String empJobTitle) {
this.empJobTitle = empJobTitle;
}
}
EmployeeLoginForm.java
@Entity()
@Table(name = "employee_login")
public class EmployeeLoginForm {
@Id
@Column(name = "username")
private String empUserName;
@Column(name = "password")
private String empPassword;
@Column(name = "status")
private String empStatus;
@Column(name = "empid")
private int empId;
public String getEmpUserName() {
return empUserName;
}
public int getEmpId() {
return empId;
}
public void setEmpId(int empId) {
this.empId = empId;
}
public void setEmpUserName(String empUserName) {
this.empUserName = empUserName;
}
public String getEmpPassword() {
return empPassword;
}
public void setEmpPassword(String empPassword) {
this.empPassword = empPassword;
}
public String getEmpStatus() {
return empStatus;
}
public void setEmpStatus(String empStatus) {
this.empStatus = empStatus;
}
}
需求:
我想在兩個表上的empid匹配時選擇來自employee_info的字段empid,empname,jobtitle和來自employee_login表的字段狀態 ...
請幫我完成我的工作......
任何建議和指導表示贊賞......
當您談論使用select語句執行連接時,您正在考慮使用數據庫/純SQL術語。 Hibernate的力量(和危險)在於它將它抽象出來並讓你以對象的方式思考。 你需要的是兩個對象之間的關系,然后讓Hibernate處理這種關系。
我建議你花些時間閱讀這篇文章:
http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/associations.html
更好地了解Hibernate如何提供幫助。
EmployeeInfoForm和EmployeeLoginForm之間存在關聯,我在您的代碼中沒有看到。 也許那里有一個員工班? 如果是這種情況,那么您需要添加它。 因此,讓我們假設每個員工都有很多表格。 然后,您將對關系的Employee端進行編碼,如下所示:
public class Employee{
@OneToMany(cascade = CascadeType.ALL, mappedBy = "employee")
private Set<EmployeeLoginForm> loginForms = new HashSet<EmployeeLoginForm>();
...
}
而EmployeeLoginForm類中關系的很多方面:
@ManyToOne
Employee employee;
這將創建表結構,以便:
emploee = (id, etc ...)
employeelogin = (id, employee, ....)
現在,只要您需要Employee的Logins列表,就可以從Employee對象獲取它而無需Query。
Set<EmployeeLoginForm> logins = e.getLoginForms(); //where e is an employee object.
如果你確實想要查詢,你可以做
select o from EmployeeLoginForm o join o.employee
但在這種情況下,這是不必要的。
您可以使用Hibernate條件投影執行以下操作:
public List extractEmployeeAttributes() {
log.debug("extractEmployeeAttributes");
try {
Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
Criteria c1 = session.createCriteria(employee_info.class,emp_info);
Criteria c2 = session.createCriteria(employee_login.class,emp_log);
c1.setProjection(Projections.projectionList()
.add(Projections.property("empid"))
.add(Projections.property("empname"))
.add(Projections.property("jobtitle"))
.add(Projections.property("employee_info "))
.add(Restrictions.and(Property.eqName(emp_info.empId,emp_log.empId))
return c1.list();
} catch (RuntimeException re) {
log.error("extractEmployeeAttributes failed", re);
throw re;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.