2013-03-11 14 views
5

Tôi đang phát triển ứng dụng bằng cách sử dụng Spring và Hibernate với MySQL. Tôi mới sử dụng Hibernate và đã thực hiện các tác vụ cơ bản ...Làm cách nào để xử lý truy vấn tham gia trong Hibernate và Spring bằng các chú thích?

Bây giờ tôi cần áp dụng các kết nối trong truy vấn chọn để lấy dữ liệu từ nhiều bảng bằng chú thích. Tôi đã tìm kiếm nó nhưng tôi vẫn không nhận được bất kỳ ý tưởng ...

Dưới đây bảng cơ sở dữ liệu của tôi và các lớp đậu:

Table 1: 'employee_info' (id, empid, empname, doj and jobtitle) 

Table 2: 'employee_login' (username, password, status and empid) 

Và lớp đậu của tôi là:

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; 
} 

} 

Yêu cầu:

Tôi muốn chọn lĩnh vực empid, empname, jobtitle từ employee_info và lĩnh vực tình trạng từ employee_login bảng khi empid phù hợp trên cả hai bảng. ..

Vui lòng giúp tôi hoàn thành công việc của mình ...

Bất kỳ đề xuất và hướng dẫn nào được đánh giá cao ...

+0

bạn đã thử bất cứ điều gì? Hibernate là có để giúp bạn với những thứ như thế này. [This] (http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/queryhql.html) sẽ là một điểm khởi đầu tốt cho bạn. – Magnilex

Trả lời

5

Bạn đang suy nghĩ về cơ sở dữ liệu/thuật ngữ SQL thuần túy khi nói về thực hiện kết nối với câu lệnh chọn. Sức mạnh (và nguy hiểm) của Hibernate là nó tóm tắt điều này khỏi bạn và cho phép bạn suy nghĩ trong các điều khoản của Object. Những gì bạn cần là một mối quan hệ giữa 2 đối tượng và sau đó để Hibernate xử lý mối quan hệ này.

tôi khuyên bạn nên dành chút thời gian đọc bài viết này:

http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/associations.html

để có được một sự hiểu biết tốt hơn về cách Hibernate có thể giúp đỡ.

4

Có sự liên kết giữa EmployeeInfoForm và EmployeeLoginForm mà tôi không thấy trong mã của bạn. Có lẽ có một lớp nhân viên ở đó? Nếu đó là trường hợp thì bạn cần phải thêm vào đó. Vì vậy, chúng ta hãy giả định rằng mỗi nhân viên có nhiều hình thức. Sau đó, bạn sẽ mã phía người lao động của mối quan hệ như thế này:

public class Employee{ 

     @OneToMany(cascade = CascadeType.ALL, mappedBy = "employee") 
     private Set<EmployeeLoginForm> loginForms = new HashSet<EmployeeLoginForm>(); 

     ... 
} 

Và Nhiều bên của mối quan hệ trong lớp EmployeeLoginForm:

@ManyToOne 
Employee employee; 

Điều này sẽ tạo ra các cấu trúc bảng như vậy mà:

emploee = (id, etc ...) 
employeelogin = (id, employee, ....) 

Bây giờ, bất cứ lúc nào bạn cần danh sách Thông tin đăng nhập của nhân viên bạn nhận được từ đối tượng Nhân viên mà không cần truy vấn.

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

Nếu bạn muốn truy vấn bạn có thể làm

select o from EmployeeLoginForm o join o.employee 

Nhưng điều đó là không cần thiết trong trường hợp này.

2

Bạn có thể làm như sau bằng cách sử dụng Hibernate tiêu chí chiếu:

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

đây là lời giải thích tuyệt vời, cảm ơn. Nhưng tôi không biết làm thế nào emp_into được tuyên bố. – JegsVala