Search code examples
javahibernateormnamed-query

java.lang.ClassCastException: [Ljava.lang.Long; cannot be cast to java.lang.Long


I have following model class:

@Entity
@Table(name="user_content")
@org.hibernate.annotations.NamedQueries({
        @org.hibernate.annotations.NamedQuery(
                name = "checkThatImagesAreModerated",
                query = "select contentId from UserContent where contentId in(:imageIdList) and moderationStatus!='TRUE'"
        )

})
public class UserContent {
...

and following dao:

Session session = sessionFactory.getCurrentSession();
    Query query = session.getNamedQuery("checkThatImagesAreModerated");
    query.setParameter("imageIdList", imageIds );
    return query.list();

Result of last row execution looks like this:

java.lang.ClassCastException: [Ljava.lang.Long; cannot be cast to java.lang.Long
    at org.hibernate.type.LongType.set(LongType.java:42)
    at org.hibernate.type.NullableType.nullSafeSet(NullableType.java:136)
    at org.hibernate.type.NullableType.nullSafeSet(NullableType.java:116)
    at org.hibernate.param.NamedParameterSpecification.bind(NamedParameterSpecification.java:38)
    at org.hibernate.loader.hql.QueryLoader.bindParameterValues(QueryLoader.java:491)
    at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1563)
    at org.hibernate.loader.Loader.doQuery(Loader.java:673)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
    at org.hibernate.loader.Loader.doList(Loader.java:2213)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104)
    at org.hibernate.loader.Loader.list(Loader.java:2099)
    at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:378)
    at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:338)
    at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:172)
    at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1121)
    at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79)
    at com.terminal.dao.impl.ContentDaoImpl.checkThatImagesAreModerated(ContentDaoImpl.java:105)
    at com.terminal.service.impl.ContentServiceImpl.checkThatImagesAreModerated(ContentServiceImpl.java:187)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
.....

hibernate log:

Hibernate: 


 select
        userconten0_.content_id as col_0_0_ 
    from
        user_content userconten0_ 
    where
        (
            userconten0_.content_id in (
                ?
            )
        ) 
        and userconten0_.moderation_status<>'TRUE'

I don't inderstand where and why hibernate tryes to convert Long[] to Long

P.S.

enter image description here


Solution

  • Try doing query.setParameterList("imageIdList", imageIds); instead of query.setParameter("imageIdList", imageIds);. When binding parameters for an in clause, you typically need to use that instead. Check out the docs for Query.java