I have created two entites (RegularEmployee and ContactEntity) that extends the Employee entity.
@Entity
@Table(name="employees")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "type", discriminatorType = DiscriminatorType.STRING)
@DiscriminatorValue(value="employee")
public class Employee {
    @Id
    @GeneratedValue
    private Long id;
    private String name;
...
Im using SINGLE_TABLE inheritance for this implementations, and created a generic JpaRepository for manipulating data:
@Repository
public interface EmployeeRepository<T extends Employee> extends JpaRepository<T, Long> {
}
I've created also the Service class that autowire three instance of these generic repositories, and specific methods for each class.
@Service
public class EmployeeService {
    @Autowired
    private EmployeeRepository<Employee> employeeRepo;
    @Autowired
    private EmployeeRepository<RegularEmployee> regularRepo;
    @Autowired
    private EmployeeRepository<ContractEmployee> contractRepo;
    public List<Employee> getAllEmployee() {
        return employeeRepo.findAll();
    }
    public List<RegularEmployee> getAllRegularEmployee(){
        return regularRepo.findAll();
    }
    public List<ContractEmployee> getAllContractEmployee() {
        return contractRepo.findAll();
    }
...
My problem is, that when I try to find all regular employees or contract employees, I always get all type of employees (employees, regular employees and contract employees all together).
I do not know why it behaves like this, even though the method's signature says it returns the appropriate type.
 
     
     
    