2014-09-26 67 views
0

继承搜索让我们假设有下面的实体:春数据 - 通过类型

@Entity 
@DiscriminatorColumn(name="Type") 
@Inheritance(strategy=InheritanceType.Joined) 
public abstract class Employee extends Persistable<Long> { 

    private String firstName; 
    private String lastName; 

    //getters, setters 
} 

@Entity 
@DiscriminatorValue("S") 
public class SalariedEmployee extends Employee { 
      //various fields 
} 

@Entity 
@DiscriminatorValue("C") 
public class ContractEmployee extends Employee { 
      //various fields 
} 

@Entity 
@DiscriminatorValue("H") 
public class HourlyEmployee extends Employee { 
      //various fields 
} 

而一个Repository

public interface EmployeeRepository implements PagingAndSortingRepository<Employee, Long> { 
} 

如何搜索做一个查询让说“给我所有的员工那不是HourlyEmployees“。很明显,我会要求这些被分页/排序,所以我可能无法做到findAll();,如果我没有弄错,只是从Page集合中删除条目。

+0

如果你想针对特定类型然后为该类型创建一个存储库。其他任何东西都是黑客行为,特别是如果您开始通过该类型的字段进行查询。 – zeroflagL 2014-09-26 18:13:25

回答

1

见JPQL类型运营商:

http://en.wikibooks.org/wiki/Java_Persistence/JPQL#JPQL_special_operators

的JPA 2.0规范(第4.6.17.4)给出的使用下面的例子:

SELECT e 
FROM Employee e 
WHERE TYPE(e) IN (Exempt, Contractor) 

SELECT e 
FROM Employee e 
WHERE TYPE(e) IN (:empType1, :empType2) 

SELECT e 
FROM Employee e 
WHERE TYPE(e) IN :empTypes 

SELECT TYPE(e) 
FROM Employee e 
WHERE TYPE(e) <> Exempt 
+0

有没有一种方法可以在Criteria API中使用它? – ChrisGeo 2014-09-26 17:42:01

+0

参见页面底部:http://www.objectdb.com/java/jpa/query/jpql/path#Entity_Type_Expressions_ – 2014-09-26 17:50:14