2

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

リクエストの「leftjoinfetchic.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 });
}

それは不可能ですか、それとも私は何かを逃していますか?

ありがとう

4

1 に答える 1

0

私も同様の問題を抱えていましたが、多くのヘッドバンギングを行った後、Hibernateが期待していた「クラス」がクラス識別子(この場合はdescriminator値)であることがわかりました。

したがって、上記の例を使用した場合の解決策は、クラスプロパティをI1としてクエリすることでした。

@Override
@SuppressWarnings("unchecked")
public List<ItemContainer> getItem1s(final Long containerId) {
return getHibernateTemplate().findByNamedQueryAndNamedParam("GET_ITEMS", new String[] { "containerId", "clazz" },
        new Object[] { containerId, "I1" });
}
于 2011-11-25T10:06:33.487 に答える