hibernate @ Любое отображение, не может получить "любой" элемент - PullRequest
2 голосов
/ 30 июня 2011

Используя hibernate @Any mapping для сопоставления нескольких объектов в одном, я не смог построить запрос для извлечения всех объектов определенного класса.

Hibernate, похоже, не способен обработать такой запрос.

Мое приложение не запускается и выдает следующую ошибку:

Invocation of init method failed; nested exception is java.lang.ClassCastException: org.hibernate.type.AnyType cannot be cast to org.hibernate.type.ComponentType

удаление части "left join fetch ic.item i" в запросе решает эту ошибку.

Например, у меня есть следующая модель:

@Entity
@NamedQueries({
@NamedQuery(name = "GET_ITEMS", query = "from ItemContainer ic left join fetch ic.item i where ic.id=:containerId and ic.class=:clazz")})
public class ItemContainer {
.... 
    @Any(metaColumn = @Column(name = "TYPE"), fetch = FetchType.LAZY)
    @AnyMetaDef(idType = "long", metaType = "string", metaValues = { @MetaValue(targetEntity = Item1.class, value = "I1") })
    @JoinColumn(name = "TYPE_ID")
    private IItem item;
...
}

(с Item1 реализует IItem)

А вот мой DAO:

@Override
@SuppressWarnings("unchecked")
public List<ItemContainer> getItem1s(final Long containerId) {
return getHibernateTemplate().findByNamedQueryAndNamedParam("GET_ITEMS", new String[] { "containerId", "clazz" },
        new Object[] { containerId, Item1.class });
}

Это просто невозможно, или я что-то упустил?

Спасибо

1 Ответ

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

У меня была похожая проблема, и после долгих потрясений я обнаружил, что Hibernate "class" ожидал, что это идентификатор класса , в данном случае значение дескриптора .

Таким образом, используя приведенный выше пример, мы решили запросить свойство класса как I1:

@Override
@SuppressWarnings("unchecked")
public List<ItemContainer> getItem1s(final Long containerId) {
return getHibernateTemplate().findByNamedQueryAndNamedParam("GET_ITEMS", new String[] { "containerId", "clazz" },
        new Object[] { containerId, "I1" });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...