Jpa 使用eclipselink查询可嵌入元素的集合

Jpa 使用eclipselink查询可嵌入元素的集合,jpa,eclipselink,Jpa,Eclipselink,我拥有以下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

我拥有以下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
}
(技能实体不应该很重要,因此会被忽略,各种附加属性也会被忽略。)

我正在使用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();
}
公共列表findBySkill(技能){
TypedQuery query=getCurrentEntityManager().createQuery(
“从员工e中选择e加入e.能力c,其中c.技能=:技能”,
雇员(类别),;
query.setParameter(“skill”,skill);
返回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
原因:异常[EclipseLink-8030](Eclipse持久性服务-2.2.0.v20110202-r8913):org.Eclipse.Persistence.exceptions.JPQLException
异常描述:编译查询时出错[从员工e中选择e加入e.Competencies c,其中c.skill=:skill],第1行第54列:未知状态或类[com.kaio.model.competency]的关联字段[skill]。
位于org.eclipse.persistence.exceptions.jpqleexception.unknownatAttribute(jpqleexception.java:457)
位于org.eclipse.persistence.internal.jpa.parsing.DotNode.validate(DotNode.java:88)
位于org.eclipse.persistence.internal.jpa.parsing.Node.validate(Node.java:91)
位于org.eclipse.persistence.internal.jpa.parsing.BinaryOperatorNode.validate(BinaryOperatorNode.java:34)
位于org.eclipse.persistence.internal.jpa.parsing.EqualsNode.validate(EqualsNode.java:41)
位于org.eclipse.persistence.internal.jpa.parsing.WhereNode.validate(WhereNode.java:34)
位于org.eclipse.persistence.internal.jpa.parsing.ParseTree.validate(ParseTree.java:207)
位于org.eclipse.persistence.internal.jpa.parsing.ParseTree.validate(ParseTree.java:183)
位于org.eclipse.persistence.internal.jpa.parsing.ParseTree.validate(ParseTree.java:173)
位于org.eclipse.persistence.internal.jpa.parsing.jpqlpassetree.populateradqueryinternal(jpqlpassetree.java:110)
位于org.eclipse.persistence.internal.jpa.parsing.jpqlpassetree.populateQuery(jpqlpassetree.java:84)
位于org.eclipse.persistence.internal.jpa.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:216)
位于org.eclipse.persistence.internal.jpa.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:187)
位于org.eclipse.persistence.internal.jpa.EJBQueryImpl.(EJBQueryImpl.java:139)
位于org.eclipse.persistence.internal.jpa.EJBQueryImpl(EJBQueryImpl.java:123)
位于org.eclipse.persistence.internal.jpa.EntityManagerImpl.createQuery(EntityManagerImpl.java:1376)
... 48多
信息很清楚:在我的班级能力中找不到技能属性。但在我看来,这是没有理由的。还是我对自己的问题有错误的看法?我应该如何查询可嵌入对象的列表


非常感谢您的帮助。

您的
能力表将有一个Skill.id字段,请尝试:

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

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

您的
能力表将有一个Skill.id字段,请尝试:

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

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

好的,这似乎是一个bug,它已在eclipse link的更高版本中得到解决。我将项目更新为EclipseLink 2.4,问题消失了。

好的,这似乎是一个bug,它已在更高版本的EclipseLink中解决。我将项目更新为EclipseLink 2.4,问题就消失了。

不,这不行。JPQL中的语法意味着获取技能属性的id属性。这将失败,因为它甚至找不到技能属性。如果我直接使用id,我将不得不使用本机sql查询,但这不是最佳的。但是您的查询没有获取技能实体。ID仍然可以访问,因为能力记录(正在获取)将有一个技能ID(引用技能表)。我已经尝试过了,它不起作用;)您不必获取技能实体。实际上,如果我引用一个基本属性(如字符串),同样的查询也会失败。我把它调试到了eclispelink的肠子里,看起来这门课的能力根本没有属性。不,这不行。JPQL中的语法意味着获取技能属性的id属性。这将失败,因为它甚至找不到技能属性。如果我直接使用id,我将不得不使用本机sql查询,但这不是最佳的。但是您的查询没有获取技能实体。ID仍然可以访问,因为能力记录(正在获取)将有一个技能ID(引用技能表)。我已经尝试过了,它不起作用;)您不必获取技能实体。实际上,如果我引用一个基本属性(如字符串),同样的查询也会失败。我把它调试到了eclispelink的肠子里,看起来这门课的能力根本没有任何属性。