2013-03-11 67 views
5

我正在开发使用Spring和Hibernate与MySQL的应用程序。我是休眠新手,做了基本任务...如何在Hibernate和Spring中使用注释处理连接查询?

现在我需要在选择查询中应用连接以使用注释从多个表中获取数据。我已经寻找它但我仍然没有得到任何想法...

这里我的数据库表和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,empname,JOBTITLEemployee_info和现场状态 employee_login表时EMPID两个表上匹配。 ..

请帮我完成我的工作...

任何建议和指导赞赏...

+0

你尝试过什么? Hibernate可以帮助你解决这类问题。 [This](http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/queryhql.html)对你来说是一个很好的起点。 – Magnilex 2013-03-11 13:16:31

回答

4

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对象获取而不需要查询。

Set<EmployeeLoginForm> logins = e.getLoginForms(); //where e is an employee object. 

如果你确实想查询你可以做

select o from EmployeeLoginForm o join o.employee 

但是,在这种情况下没有必要。

2

你可以使用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; 

    } 

} 
+1

这是很好的解释,谢谢。但我不知道emp_into是如何声明的。 – JegsVala 2015-11-05 07:06:14

相关问题