2013-08-22 88 views
17

Làm thế nào tôi có thể làm câu SQL này trong Hibernate? Tôi muốn sử dụng Hibernate để tạo truy vấn, không tạo cơ sở dữ liệu.HQL Hibernate INNER JOIN

SELECT * FROM Employee e INNER JOIN Team t ON e.Id_team=t.Id_team 

Tôi tạo ra các lớp thực thể trong SQLServer2008,

@Entity 
@Table(name="EMPLOYEE") 
public class Employee 
{ 
    @Id @GeneratedValue 
    @Column(name="ID_EMPLOYEE") 
    private int id_employee; 
    @Column(name="SURNAME") 
    private String surname; 
    @Column(name="FIRSTNAME") 
    private String firstname; 
    @Column(name="ID_PROFESSION") 
    private int id_profession; 
    @Column(name="ID_BOSS") 
    private int id_boss; 
    @Column(name="HIRED_DATE") 
    private Date hired; 
    @Column(name="SALARY") 
    private double salary; 
    @Column(name="SALARY_ADD") 
    private double salary_add; 
    @Column(name="ID_TEAM") 
    private int id_team; 
//set and get 

@Entity 
@Table(name="TEAM") 
public class Team 
{ 
    @Id @GeneratedValue 
    @Column(name="ID_TEAM") 
    private int id_team; 
    @Column(name="TEAMNAME") 
    private String teamname; 
    @Column(name="ADDRESS") 
    private String address; 
//set and get 

Tôi cố gắng để xây dựng làm việc chọn truy vấn bằng nhiều cách nhưng nó vẫn không hoạt động.

  SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory(); 
      Session session = sessionFactory.openSession();     
      session.beginTransaction(); 
      String select = "FROM Employee e INNER JOIN Team t ON e.Id_team=t.Id_team"; 
      Query query = session.createQuery(select); 
      List elist = query.list(); 
      session.getTransaction().commit(); 
      session.close();  

Có lẽ sth là sai với thực thể?

+0

Lỗi là gì? –

+0

theo cách bạn đã thêm t.Id ở cuối truy vấn, nhưng trong thực thể nhóm của bạn, nó là id_team. Bạn có thể thay đổi nó thành t.id_team –

+0

bạn tạo không chính xác các lớp enity không. Tôi nghĩ rằng bạn cần phải viết lại và sử dụng các công trình như nhiều người, một-một hoặc một cái gì đó như vậy –

Trả lời

31

Tham gia chỉ có thể được sử dụng khi có liên kết giữa các thực thể. Thực thể Nhân viên của bạn không được có trường có tên id_team, thuộc loại int, được ánh xạ tới một cột. Nó cần phải có một hiệp hội ManyToOne với tổ chức Đội, ánh xạ như một JoinColumn:

@ManyToOne 
@JoinColumn(name="ID_TEAM") 
private Team team; 

Sau đó, các truy vấn sau đây sẽ làm việc một cách hoàn hảo:

select e from Employee e inner join e.team 

Mà sẽ tải tất cả các nhân viên, ngoại trừ những aren không liên quan đến bất kỳ nhóm nào.

Điều tương tự cũng xảy ra đối với tất cả các trường khác là khóa ngoài đối với một số bảng khác được ánh xạ dưới dạng thực thể, tất nhiên (id_boss, id_profession).

Đã đến lúc bạn đọc tài liệu Hibernate, vì bạn đã bỏ lỡ một phần cực kỳ quan trọng của nó là gì và nó hoạt động như thế nào.

+0

là nó có thể tạo ra một hiệp hội với nhân viên id_employee và Employee id_boss phải được loại bỏ như bạn đã viết ở trên ? đây là cùng một bảng (ví dụ: một id_employee công nhân = 5 có một ông chủ id_boss = 1 (người tham khảo id_employee = 1), tôi nên tạo: \t @OneToOne \t @JoinColumn (name = "ID_EMPLOYEE") \t riêng Nhân viên của nhân viên, // Tôi muốn nhận tên của sếp, nhưng phương thức này không làm việc employeeList.getEmployee().getSurname(); – szefu

+0

Một ông chủ có nhiều nhân viên, và một nhân viên có một ông chủ duy nhất, vì vậy nó phải là '@ManyToOne @JoinColumn (name =" id_boss ") tư nhân Ông chủ nhân viên ' –

+0

tất nhiên bạn đang đúng – szefu

3
import java.io.Serializable; 
import java.util.ArrayList; 
import java.util.List; 
import javax.persistence.CascadeType; 
import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.OneToMany; 
import javax.persistence.Table; 

@Entity 
@Table(name="empTable") 
public class Employee implements Serializable{ 
private static final long serialVersionUID = 1L; 
private int id; 
private String empName; 

List<Address> addList=new ArrayList<Address>(); 


@Id 
@GeneratedValue(strategy=GenerationType.IDENTITY) 
@Column(name="emp_id") 
public int getId() { 
    return id; 
} 
public void setId(int id) { 
    this.id = id; 
} 
public String getEmpName() { 
    return empName; 
} 
public void setEmpName(String empName) { 
    this.empName = empName; 
} 

@OneToMany(mappedBy="employee",cascade=CascadeType.ALL) 
public List<Address> getAddList() { 
    return addList; 
} 

public void setAddList(List<Address> addList) { 
    this.addList = addList; 
} 
} 

Chúng tôi có hai thực thể Nhân viên và địa chỉ với mối quan hệ Một đến nhiều.

import java.io.Serializable; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.JoinColumn; 
import javax.persistence.ManyToOne; 
import javax.persistence.Table; 

@Entity 
@Table(name="address") 
public class Address implements Serializable{ 

private static final long serialVersionUID = 1L; 

private int address_id; 
private String address; 
Employee employee; 

@Id 
@GeneratedValue(strategy=GenerationType.IDENTITY) 
public int getAddress_id() { 
    return address_id; 
} 
public void setAddress_id(int address_id) { 
    this.address_id = address_id; 
} 
public String getAddress() { 
    return address; 
} 
public void setAddress(String address) { 
    this.address = address; 
} 

@ManyToOne 
@JoinColumn(name="emp_id") 
public Employee getEmployee() { 
    return employee; 
} 
public void setEmployee(Employee employee) { 
    this.employee = employee; 
} 
} 

Bằng cách này chúng ta có thể thực hiện bên trong kết hợp giữa hai bảng

import java.util.List; 
import org.hibernate.Query; 
import org.hibernate.Session; 

public class Main { 

public static void main(String[] args) { 
    saveEmployee(); 

    retrieveEmployee(); 

} 

private static void saveEmployee() { 
    Employee employee=new Employee(); 
    Employee employee1=new Employee(); 
    Employee employee2=new Employee(); 
    Employee employee3=new Employee(); 

    Address address=new Address(); 
    Address address1=new Address(); 
    Address address2=new Address(); 
    Address address3=new Address(); 

    address.setAddress("1485,Sector 42 b"); 
    address1.setAddress("1485,Sector 42 c"); 
    address2.setAddress("1485,Sector 42 d"); 
    address3.setAddress("1485,Sector 42 a"); 

    employee.setEmpName("Varun"); 
    employee1.setEmpName("Krishan"); 
    employee2.setEmpName("Aasif"); 
    employee3.setEmpName("Dut"); 

    address.setEmployee(employee); 
    address1.setEmployee(employee1); 
    address2.setEmployee(employee2); 
    address3.setEmployee(employee3); 

    employee.getAddList().add(address); 
    employee1.getAddList().add(address1); 
    employee2.getAddList().add(address2); 
    employee3.getAddList().add(address3); 

    Session session=HibernateUtil.getSessionFactory().openSession(); 

    session.beginTransaction(); 

    session.save(employee); 
    session.save(employee1); 
    session.save(employee2); 
    session.save(employee3); 
    session.getTransaction().commit(); 
    session.close(); 
} 

private static void retrieveEmployee() { 
    try{ 

    String sqlQuery="select e from Employee e inner join e.addList"; 

    Session session=HibernateUtil.getSessionFactory().openSession(); 

    Query query=session.createQuery(sqlQuery); 

    List<Employee> list=query.list(); 

    list.stream().forEach((p)->{System.out.println(p.getEmpName());});  
    session.close(); 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
} 
} 

Tôi đã sử dụng Java 8 vòng lặp for cho priting tên. Hãy chắc chắn rằng bạn có jdk 1.8 với tomcat 8. Ngoài ra thêm một số hồ sơ nhiều hơn cho sự hiểu biết tốt hơn.

public class HibernateUtil { 
private static SessionFactory sessionFactory ; 
static { 
    Configuration configuration = new Configuration(); 

    configuration.addAnnotatedClass(Employee.class); 
    configuration.addAnnotatedClass(Address.class); 
        configuration.setProperty("connection.driver_class","com.mysql.jdbc.Driver"); 
    configuration.setProperty("hibernate.connection.url", "jdbc:mysql://localhost:3306/hibernate");         
    configuration.setProperty("hibernate.connection.username", "root");  
    configuration.setProperty("hibernate.connection.password", "root"); 
    configuration.setProperty("dialect", "org.hibernate.dialect.MySQLDialect"); 
    configuration.setProperty("hibernate.hbm2ddl.auto", "update"); 
    configuration.setProperty("hibernate.show_sql", "true"); 
    configuration.setProperty(" hibernate.connection.pool_size", "10"); 


    // configuration 
    StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()); 
    sessionFactory = configuration.buildSessionFactory(builder.build()); 
} 
public static SessionFactory getSessionFactory() { 
    return sessionFactory; 
} 
} 
0

Bạn có thể làm điều đó mà không phải tạo bản đồ Hibernate thực. Hãy thử điều này:

SELECT * FROM Employee e, Team t WHERE e.Id_team=t.Id_team