1

次の JPA (2.0.2) エンティティがあります。

従業員

@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
}

(スキル エンティティは重要ではないため、省略されています。さまざまな追加属性も同様です。)

EclipseLink (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

メッセージは非常に明確です: クラス Competence の属性 Skill が見つかりません。しかし、私の意見では、その理由はありません。それとも、私の問題に対するアプローチが間違っていますか? 埋め込み可能なオブジェクトのリストをクエリするにはどうすればよいですか?

どんな助けでも大歓迎です。

4

2 に答える 2

1

わかりました、これはバグのようで、Eclipse リンクの新しいバージョンで解決されています。プロジェクトを EclipseLink 2.4 に更新したところ、問題はなくなりました。

于 2012-08-02T12:56:14.343 に答える
0

テーブルにはSkill.idCompetenceフィールドがあるので、次を試してください。

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

query.setParameter("skillId", skill.getId());
于 2012-08-02T05:05:57.017 に答える