2012-05-22 50 views
0

我正在使用EL,当我运行下面的查询时,我一直收到0。我想知道当前有效的申请人数(AP)。子实体申请人是Person,我想避免查询Person的所有元素?JPA EclipseLink getCount子实体

@RooJavaBean 
@RooToString 
@RooEntity(identifierColumn = "personID", inheritanceType = "SINGLE_TABLE") 
@DiscriminatorColumn(name = "TYPE", discriminatorType = DiscriminatorType.STRING, length = 20) 
@DiscriminatorValue("P") 
public class Person { 

    @NotNull 
    @Size(min = 1, max = 50) 
    private String FirstName; 

    @NotNull 
    @Size(min = 1, max = 50) 
    private String LastName; 
} 

子实体 '申请人'

@RooJavaBean 
@RooToString 
@RooEntity 
@DiscriminatorValue("AP") 
public class Applicant extends Person{ 

    private String major; 

    private String nativeLanguage; 

    private String ethnicity; 

    private String hispanic; 
} 

我的查询尝试:

/** 
    * 
    * @return 
    */ 
    public int getCountActiveApplicants(){ 

     EntityManager entityManager = factory.createEntityManager(); 
     int value = entityManager.createQuery("select count(distinct o) from Person o where o.TYPE = \"AP\" AND o.active = \"Yes\" ").getFirstResult(); 

     System.out.println("wowzer " + value + "\n"); 
     return value; 
    } 

回答

0

你为什么不干脆算申请人?

select count(distinct a) from Applicant a where a.active = true 

EclipseLink将在SQL中对此进行转换,并为鉴别器添加where子句。 请记住,JPQL与您的实体及其持久性字段/属性一起工作。它知道他们的关联和他们的继承层次。 JPQL从不使用表名和列名。

(旁注:为什么要用“是”一个布尔场?)

+0

它实际上不是一个布尔字段我想将它设置为“是”或“否”,但它可能不是一个很好的事情时,我可以使用真或假。我会立即尝试这个查询。谢谢 – Warz

+0

得到这个实体经理的计数,我应该使用getFirstResult()? – Warz

+0

不可以。您应该使用getSingleResult():http://docs.oracle.com/javaee/6/api/javax/persistence/Query.html#getSingleResult%28%29。 getFirstResult()返回setFirstResult()设置的内容。 –

相关问题