Синтаксис JPA 2 «член» не работает с членами суперкласса - PullRequest
3 голосов
/ 02 февраля 2011

В основном у меня есть именованный запрос "findServerWithNic", который отказывается работать:

@Entity
@Table(name = "vnm_server")
@DiscriminatorValue("S")
@NamedQueries({
    @NamedQuery(
        name="findServerWithNic",
        query="SELECT s FROM Server s, Nic n "+
                "WHERE n.id = :nicId AND n member of s.nics"
    )
})
public class Server extends NetworkedDevice implements Serializable
{...}

nics не определен на сервере, но в его суперклассе NetworkedDevice:

@Entity
@Table(name = "vnm_networked_device")
@DiscriminatorColumn(name = "c_device_type", discriminatorType = DiscriminatorType.CHAR)
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class NetworkedDevice extends AbstractIdentifyable implements Serializable
{
    @OneToMany(mappedBy = "connectedHost", cascade = CascadeType.ALL)
    @OrderColumn(name = "c_index")
    protected List<Nic> nics = new ArrayList<Nic>();

    public List<Nic> getNics() {
        return nics;
    }

    public void setNics(List<Nic> nics) {
        this.nics = nics;
    }
}

теперь у менятестовый сценарий, который создает экземпляры Nic и добавляет его к экземпляру сервера (s.getNics () содержит экземпляр, я проверил), но вызов запроса

public Server findVirtualServerOfNic(Long nicId) {        
    final Server network = em.createNamedQuery("findServerWithNic", Server.class)
                                .setParameter("nicId", nicId)
                                    .getSingleResult();
    return network;
}

приводит к исключению NoResultException

Caused by: javax.persistence.NoResultException: getSingleResult() did not retrieve any entities.
    at org.eclipse.persistence.internal.jpa.EJBQueryImpl.throwNoResultException(EJBQueryImpl.java:1246)
    at org.eclipse.persistence.internal.jpa.EJBQueryImpl.getSingleResult(EJBQueryImpl.java:750)
    at com.profitbricks.provisioning.vnm.jpa.impl.VNManagementJPAImpl.findVirtualServerOfNic(VNManagementJPAImpl.java:101)

Первоначально член nics был закрытым, но даже установка его в защищенный не работала.Мы используем eclipselink 2.2.0-M4 в качестве нашего JPA 2-провайдера.Это ошибка eclipselink или запрос неправильный?

1 Ответ

2 голосов
/ 02 февраля 2011

Вы совершили или сбросили транзакцию?Если вы этого не сделали, то база данных может не иметь значения (в зависимости от вашего режима очистки), поэтому ваш запрос ничего не даст.

Включите ведение журнала и включите SQL.Если SQL правильный?

"member of" - это общий старый синтаксис JPQL, обычно вместо него теперь используется "join"

"SELECT s FROM Server s join s mics n WHERE n.id=: nicId "

...