2013-03-11 8 views
5

Sto sviluppando un'applicazione che utilizza Spring e Hibernate con MySQL. Sono nuovo di Hibernate e ho svolto compiti di base ...Come gestire la query di join in Hibernate e Spring con annotazioni?

Ora ho bisogno di applicare i join nella query di selezione per ottenere dati da più tabelle utilizzando le annotazioni. Ho cercato per esso, ma ancora non ho avuto alcuna idea ...

Ecco le mie tabelle di database e le classi di fagioli:

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

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

E le mie classi di fagioli sono:

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

} 

Requisito:

Voglio selezionare i campi EmpID, EmpName, jobTitle da employee_info e campo stato da employee_login tavolo quando l'EmpID corrisponde su entrambi tavolo. ..

Per favore aiutami a completare il mio lavoro ...

Eventuali suggerimenti e linee guida sono apprezzati ...

+0

Hai provato qualcosa? Hibernate è lì per aiutarti con cose come questa. [Questo] (http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/queryhql.html) sarebbe un buon punto di partenza per te. – Magnilex

risposta

5

si sta pensando in termini di SQL/puri di database quando si parla di esecuzione si unisce con select. Il potere (e il pericolo) di Hibernate è che astrae questo da te e ti fa pensare in termini Object. Quello di cui hai bisogno è una relazione tra i 2 oggetti e poi lasciare che Hibernate gestisca questa relazione.

vi consiglio di trascorrere un po 'tempo a leggere questo:

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

per ottenere una migliore comprensione di come Hibernate può aiutare.

4

Esiste un'associazione tra EmployeeInfoForm e EmployeeLoginForm che non vedo nel codice. Forse c'è una classe Employee lì? Se questo è il caso, devi aggiungerlo. Quindi supponiamo che ogni dipendente abbia molte forme. Poi si codificare il lato dei dipendenti della relazione in questo modo:

public class Employee{ 

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

     ... 
} 

e le molte lato della relazione nella classe EmployeeLoginForm:

@ManyToOne 
Employee employee; 

Questo creerà la struttura della tabella in modo che:

Ora, in qualsiasi momento è necessario un elenco degli accessi di un dipendente, è possibile ottenerlo dall'oggetto Impiegato senza aver bisogno di una query.

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

Se avete voglia di interrogare si può fare

select o from EmployeeLoginForm o join o.employee 

Ma questo non è necessaria in questo caso.

2

È possibile effettuare le seguenti operazioni utilizzando il criterio di proiezione 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

questa è una grande spiegazione, grazie. Ma non so come si dichiara emp_into. – JegsVala

Problemi correlati