JPA: PersistenceException "неизвестное состояние или поле ассоциации" - PullRequest
3 голосов
/ 11 ноября 2011

Я пытаюсь понять, как делать (простые) объединения в JPQL. У меня есть две таблицы / сущности: Родитель и Дитя.

@Entity
@Table(name = "Parent")
@NamedQueries({
    @NamedQuery(name = "Parent.findByStatus", query = "SELECT p FROM Parent p WHERE p.status = :status")})
public class Parent
{
    private String parentId;
    private Set<Child> children;
    private String status;

    public Parent()
    {
        // empty constructor
    }

    @Id
    @Column(name = "PARENT_ID")
    public String getParentId()
    {
        return parentId;
    }

    public void setParentId(String parentId)
    {
        this.parentId= parentId;
    }

    // bi-directional many-to-one association to Child
    @OneToMany(mappedBy = "parent")
    public Set<Child> getChildren()
    {
        return children;
    }

    public void setChildre(Set<Child> children)
    {
        this.children= children;
    }
    @Column(name = "STATUS")
    public String getStatus()
    {
        return status;
    }

    public void setStatus(String status)
    {
        this.status = status;
    }
}

@Entity
@NamedQueries({
        @NamedQuery(name = "Child.findByStatus", query = "SELECT c FROM Child c WHERE c.status = :status"),
        @NamedQuery(name = "Child.findByParentId", query = "SELECT c FROM Child c JOIN c.parent p WHERE p.parentId = :parentId"),
        @NamedQuery(name = "Child.findByParentIdAndStatus", query = "SELECT c FROM Child c JOIN c.parent p WHERE p.parentId = :parentId AND c.status = :status") })
public class Child
{
    private childId id;
    private String status;
    private Parent parent;

    public Child()
    {
        // empty constructor
    }

    @Id
    @Column(name = "CHILD_ID")
    public String getChildId()
    {
        return childId;
    }

    public void setChildId(String childId)
    {
        this.childId= childId;
    }

    // bi-directional many-to-one association to Parent 
    @ManyToOne
    @JoinColumn(name = "PARENT_ID")
    public Parent getParent ()
    {
        return parent;
    }

    public void setParent(Parent parent)
    {
        this.parent= parent;
    }

    @Column(name = "STATUS")
    public String getStatus()
    {
        return status;
    }

    public void setStatus(String status)
    {
        this.status = status;
    }
}

Но это вызывает следующее исключение:

Caused by: javax.persistence.PersistenceException: Exception [EclipseLink-8030] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.JPQLException
Exception Description: Error compiling the query [Child.findByParentId: SELECT c FROM Child c JOIN c.parent p WHERE p.parentId = :parentId], line 1, column 47: unknown state or association field [parentId] of class [my.model.Parent].

Насколько я понимаю, JPQL пересекает объектную модель в соединениях. Итак, в запросе:

SELECT c FROM Child c JOIN c.parent p WHERE p.parentId = :parentId

p - выбранный родительский объект, связанный с дочерними объектами. Если это правильно, то почему я получаю ошибку? Родительский объект имеет поле parentId и поэтому должно быть в порядке, да?

Ответы [ 2 ]

2 голосов
/ 14 ноября 2011

Ваш JPQL выглядит корректно. Проверьте, правильно ли вы скомпилировали код (недавно вы переименовали поле?).

Работает ли запрос к другим полям? Что если вы переименуете поле в id?

0 голосов
/ 14 ноября 2011

вы можете использовать поля Child для достижения этой цели,

from Child c where c.parent.id = :parent_id

или просто если у вас есть ссылка на родителя, а не только идентификатор.

from Child c where c.parent = :parent

hibernate выяснит само соединение.

...