EclipseLink: сбой запроса к MappedSuperclass - PullRequest
3 голосов
/ 05 июля 2010

Мое приложение - это магазин, торгующий рыбой, аквариумами и т. Д. Я хочу получить список из 10 лучших товаров среди всех товаров на основе количества продаж. Я использую следующий класс:

@MappedSuperclass
@NamedQueries({
    @NamedQuery(name="getTopItems",query="SELECT x FROM FishStoreItem x ORDER BY x.salescnt DESC, x.title DESC")
})
public abstract class FishStoreItem 
       extends DomainSuperClass implements Serializable {
......
}

Проблема в следующем исключении:

Исключение [EclipseLink-8034] (Eclipse Постоянные Услуги - 2.0.0.v20091127-r5931): org.eclipse.persistence.exceptions.JPQLException Описание исключения: ошибка компиляции запрос [getTopItems: SELECT x FROM FishStoreItem x ЗАКАЗАТЬ ПО x.salescnt DESC, x.title DESC]. Неизвестная сущность введите [FishStoreItem].

Тот же код отлично работает с Apache OpenJpa 2.0.0, но не работает с EclipseLink ver 2.1.0, 2.0.1, 1.0.

P.S. Я уже нашел это решение для Hibernate, но я хочу быть уверен, что это невозможно и для EclipseLink.

Ответы [ 3 ]

6 голосов
/ 05 июля 2010

Сопоставленный суперкласс не является сущностью и не позволяет запрашивать, сохранять или связывать суперкласс (см. Сопоставленные суперклассы ).

Это подтверждается в Руководстве пользователя Apache OpenJPA 2.0:

1,3. Сопоставленный суперкласс

A сопоставленный суперкласс не является сущностью класс, который может определять постоянное состояние и отображение информации для объекта подклассы. Отображенные суперклассы обычно абстрактно. В отличие от истины объекты, вы не можете запросить сопоставленные суперкласс, передать сопоставленный суперкласс экземпляр к любому EntityManager или Запрашивать методы или объявлять постоянные связь с отображенным суперклассом цель. Вы обозначаете сопоставленный суперкласс с маркером MappedSuperclass аннотаций.

...

Примечание

OpenJPA позволяет запрашивать сопоставленные суперкласса. Запрос на сопоставленный суперкласс вернет все соответствующие экземпляры подкласса. OpenJPA также позволяет объявить отношения с сопоставленные типы суперкласса; однако вы не может запрашивать эти отношения.

Итак, хотя OpenJPA разрешает ваш запрос, это выходит за рамки JPA. Не ожидайте, что он будет работать с любым провайдером JPA.

2 голосов
/ 05 июля 2010

Можете ли вы подтвердить, что вы просто хотите запустить отдельный запрос для каждого подкласса сущности и агрегировать результаты?

Это похоже на запрос TABLE_PER_CLASS.

В прошлом я создал расширение для EclipseLink, которое может обрабатывать такие запросы, и мы можем исследовать его добавление в проект, если есть заинтересованность сообщества, и мы можем определить требования.

Дуг

0 голосов
/ 05 июля 2010

Этот код также отлично работает с DataNucleus в качестве реализации JPA. Возможность запрашивать экземпляры сопоставленного суперкласса, хотя и выходит за рамки спецификации JPA, является очень разумной вещью, и мы верим в предоставление таких вещей. В конце концов, поставщик персистентности знает, какие существуют подклассы этого сопоставленного суперкласса, поэтому не имеет смысла запрещать пользователю такую ​​возможность.

...