2012-08-01 65 views
1

查詢嵌入元素的集合我有以下JPA(2.0.2)實體:使用的EclipseLink

僱員

@Entity 
@Table(name = "T_EMPLOYEE") 
public class Employee { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Integer id; 

    @ElementCollection 
    @CollectionTable(name = "T_COMPETENCE") 
    private Set<Competence> competences; 

    // Getter and setters 
} 

和能力

@Embeddable 
public class Competence { 
    @JoinColumn(nullable = false) 
    @ManyToOne 
    private Skill skill; 

    // Getter and setters 
} 

(技能實體當不可t是重要的,因此被省略,各種附加屬性也是如此)。

我使用E clipseLink(2.2.0)用DAO查詢我的實體。現在,我想用下面的查詢:

public List<Employee> findBySkill(Skill skill) { 
    TypedQuery<Employee> query = getCurrentEntityManager().createQuery(
     "SELECT e FROM Employee e JOIN e.competences c WHERE c.skill = :skill", 
     Employee.class); 
    query.setParameter("skill", skill); 
    return query.getResultList(); 
} 

但它不斷拋出以下異常:

Caused by: Exception [EclipseLink-8030] (Eclipse Persistence Services - 2.2.0.v20110202-r8913): org.eclipse.persistence.exceptions.JPQLException 
Exception Description: Error compiling the query [SELECT e FROM Employee e JOIN e.competences c WHERE c.skill = :skill], line 1, column 54: unknown state or association field [skill] of class [com.kaio.model.Competence]. 
    at org.eclipse.persistence.exceptions.JPQLException.unknownAttribute(JPQLException.java:457) 
    at org.eclipse.persistence.internal.jpa.parsing.DotNode.validate(DotNode.java:88) 
    at org.eclipse.persistence.internal.jpa.parsing.Node.validate(Node.java:91) 
    at org.eclipse.persistence.internal.jpa.parsing.BinaryOperatorNode.validate(BinaryOperatorNode.java:34) 
    at org.eclipse.persistence.internal.jpa.parsing.EqualsNode.validate(EqualsNode.java:41) 
    at org.eclipse.persistence.internal.jpa.parsing.WhereNode.validate(WhereNode.java:34) 
    at org.eclipse.persistence.internal.jpa.parsing.ParseTree.validate(ParseTree.java:207) 
    at org.eclipse.persistence.internal.jpa.parsing.ParseTree.validate(ParseTree.java:183) 
    at org.eclipse.persistence.internal.jpa.parsing.ParseTree.validate(ParseTree.java:173) 
    at org.eclipse.persistence.internal.jpa.parsing.JPQLParseTree.populateReadQueryInternal(JPQLParseTree.java:110) 
    at org.eclipse.persistence.internal.jpa.parsing.JPQLParseTree.populateQuery(JPQLParseTree.java:84) 
    at org.eclipse.persistence.internal.jpa.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:216) 
    at org.eclipse.persistence.internal.jpa.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:187) 
    at org.eclipse.persistence.internal.jpa.EJBQueryImpl.<init>(EJBQueryImpl.java:139) 
    at org.eclipse.persistence.internal.jpa.EJBQueryImpl.<init>(EJBQueryImpl.java:123) 
    at org.eclipse.persistence.internal.jpa.EntityManagerImpl.createQuery(EntityManagerImpl.java:1376) 
    ... 48 more 

的信息是很清楚的:它不能找到我的階級屬性技能權限。但在我看來,這沒有任何理由。或者我對我的問題有錯誤的看法?我應該如何在可嵌入對象列表中查詢?

任何幫助表示讚賞。

回答

1

好了,這似乎是一個錯誤,它在Eclipse中的鏈接更高版本已經解決了。我將項目更新到EclipseLink 2.4,問題消失了。

0

Competence表將有Skill.id場,所以嘗試:

"SELECT e FROM Employee e JOIN e.competences c WHERE c.skill.id = :skillId" 

query.setParameter("skillId", skill.getId()); 
+0

不,這是行不通的。您在JPQL中的語法意味着讓我獲得技能屬性的id屬性。這將失敗,因爲它甚至找不到技能屬性。如果我直接使用id,我不得不使用原生的sql查詢,但這不是最優的。 – jokr 2012-08-02 08:03:49

+0

但是,您的查詢不提取技能實體。該ID仍然可以訪問,因爲能力記錄(正在提取)將有一個技能ID(參考技能表) – MattR 2012-08-02 08:08:54

+0

我已經嘗試過了,它不起作用;)您不必取得技能實體。實際上,如果我引用像字符串這樣的基本屬性,同樣的查詢也會失敗。我將它調試到eclispelink的腸子,看起來類的能力根本沒有任何屬性。 – jokr 2012-08-02 08:22:54