hibernate@Any映射,无法获取“Any”项

hibernate@Any映射,无法获取“Any”项,hibernate,request,fetch,any,Hibernate,Request,Fetch,Any,使用hibernate@Any映射来映射同一个类中的多个实体,我无法生成一个请求来获取特定类的所有对象 Hibernate似乎无法处理此类请求 我的应用程序未启动并引发以下错误: Invocation of init method failed; nested exception is java.lang.ClassCastException: org.hibernate.type.AnyType cannot be cast to org.hibernate.type.ComponentTyp

使用hibernate@Any映射来映射同一个类中的多个实体,我无法生成一个请求来获取特定类的所有对象

Hibernate似乎无法处理此类请求

我的应用程序未启动并引发以下错误:

Invocation of init method failed; nested exception is java.lang.ClassCastException: org.hibernate.type.AnyType cannot be cast to org.hibernate.type.ComponentType
删除请求中的部分左连接获取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

这是我的刀:

@Override
@SuppressWarnings("unchecked")
public List<ItemContainer> getItem1s(final Long containerId) {
return getHibernateTemplate().findByNamedQueryAndNamedParam("GET_ITEMS", new String[] { "containerId", "clazz" },
        new Object[] { containerId, Item1.class });
}
是不可能,还是我错过了什么


谢谢

我遇到了一个类似的问题,经过一番讨论后,我发现Hibernate所期望的类是一个类标识符,在本例中是描述符值

因此,使用上述示例,解决方案是将类属性作为I1查询:

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

我有一个类似的问题,经过多次讨论后,我发现Hibernate所期望的类是一个类标识符,在本例中是描述符值

因此,使用上述示例,解决方案是将类属性作为I1查询:

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

这是不可能的还是你错过了什么?我知道这是几个月前的事了,但我有同样的问题…类是类名,而不是类对象。所以它不是新对象[]{containerId,Item1.class};但是新对象[]{containerId,Item1.class.getCanonicalName};事实证明,类就是描述符值。所以我的解决方案是检查field.class=和field.id=。在上面的例子中:ic.class='I1'和ic.id=etc,我认为我最好加上它作为答案!这是不可能的还是你错过了什么?我知道这是几个月前的事了,但我有同样的问题…类是类名,而不是类对象。所以它不是新对象[]{containerId,Item1.class};但是新对象[]{containerId,Item1.class.getCanonicalName};事实证明,类就是描述符值。所以我的解决方案是检查field.class=和field.id=。在上面的例子中:ic.class='I1'和ic.id=etc,我认为我最好加上它作为答案!使用CanonicalName,它可能是最好的解决方案:Item1.class.getCanonicalName使用CanonicalName,它可能是最好的解决方案:Item1.class.getCanonicalName