public abstract class BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
// Getters and setters
}
@Entity
@Table(name = "employees")
public class Employee extends BaseEntity {
private String firstName;
private String lastName;
// Getters and setters
}
@Entity
@Table(name = "managers")
public class Manager extends Employee {
private String department;
// Getters and setters
}
@Entity
@Table(name = "departments")
public class Department {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@OneToMany(mappedBy = "department")
private List<Employee> employees;
// Getters and setters
}
@Entity
@Table(name = "employees")
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@ManyToOne
@JoinColumn(name = "department_id")
private Department department;
// Getters and setters
}
@Entity
@Table(name = "departments")
public class Department {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@OneToMany(mappedBy = "department", fetch = FetchType.LAZY)
private List<Employee> employees;
// Getters and setters
}
@Entity
@Table(name = "employees")
@Cacheable
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
// Other fields
// Getters and setters
}
public List<Employee> getEmployeesByDepartment(String departmentName) {
Query query = entityManager.createQuery("SELECT e FROM Employee e JOIN e.department d WHERE d.name = :departmentName");
query.setParameter("departmentName", departmentName);
return query.getResultList();
}