如何修复“无法解析属性:id.element”使用@EmbeddedId

时间:2019-04-25 12:03:29

标签: java hibernate orm entity hibernate-entitymanager

我有一个方法在查询 Hibernate 实体列表时抛出下一个错误,同时还通过Join OneToOne 关系进行获取,让子级为 @ EmbeddedId

  

org.springframework.orm.hibernate3.HibernateSystemException:无法解析属性:id.element;嵌套的异常是org.hibernate.HibernateException:无法解析属性:id.element

这是查询方法:

public List<Element> findAll() {
  CriteriaBuilder criteriaBuilder = getEntityManager().getCriteriaBuilder();

  CriteriaQuery<Element> criteriaQuery = criteriaBuilder.createQuery(Element.class);
  Root<Element> root = criteriaQuery.from(Element.class);

  criteriaQuery.select(root).distinct(true);

  root.fetch(Element_.elementSubstitute, JoinType.LEFT);

  return getEntityManager().createQuery(criteriaQuery).getResultList();;
}

当没有结果 elementSubstitutes 时,此方法很好用。同样的方法也可以用于其他 non-embedded-entities ,但是这些方法是使用 @EmbeddedId 映射的,这就是为什么我认为这是导致错误的原因

@Entity
@Table(name = "ELEMENT")
public class Element {

        //stuff

        @OneToOne(mappedBy = "id.element", fetch = FetchType.LAZY)
        private ElementSubstitute elementSubstitute;
}

@StaticMetamodel(Element.class)
public class Element_ {

    //stuff

    public static volatile SingularAttribute<Element, ElementSubstitute> elementSubstitute;
}

@Entity
@Table(name = "ELEMENT_SUBSTITUTE")
public class ElementSubstitute {

    @EmbeddedId
    private ElementSubstituteId id = new ElementSubstituteId();

    //stuff
}

@Embeddable
public class ElementSubstituteId {

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "ID_OWNER")
    private Owner owner;

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "ID_ELEMENT")
    private Element element;
}

使用 getElementSubstitute()从单个 Element 实体获取 ElementSubstitute 也是可行的,因此映射没有错,并且 Hibernate 确实可以在需要时识别出属性 id.element 。为什么在查询中进行联接获取时为什么会失败?

0 个答案:

没有答案