2014-09-26 70 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