Pergunta

I am implementing an exists function which checks if entities with a given Id are present in a DB:

protected boolean[] _exists(final Serializable... ids) {
        //initlialize
        final boolean[] ret = new boolean[ids.length];

        final StringBuilder sb = new StringBuilder("select id FROM " + getEntityMedaData(this.modelAdaptor.getDbModelClass()).getEntityName() + " obj " );
        sb.append(" WHERE obj.id in (:ids) ");

        LOG.debug("query = " + sb.toString() );
        final Query query = getSession().createQuery(sb.toString());
        query.setParameterList("ids", ids);

        final List<Serializable> results = query.list(); //exception occurs here
        System.out.println(results);
        LOG.debug("number of ids found = " + results.size() );
        final Set<Serializable> idsFoundSet = new HashSet<>(results);
        for(int i=0 ;i< ids.length;i++){
            if(idsFoundSet.contains(ids[i])){
                ret[i]=true;
            }
        }


        return ret;
    }

I invoke this table by passing the table's primary key. Note that the primary key is a composite primary key. But then it throws an exception at query.list():

java.lang.ClassCastException: mypkg.NodePK cannot be cast to java.lang.String
    at org.hibernate.type.descriptor.java.StringTypeDescriptor.unwrap(StringTypeDescriptor.java:39)
    at org.hibernate.type.descriptor.sql.VarcharTypeDescriptor$1.doBind(VarcharTypeDescriptor.java:57)
    at org.hibernate.type.descriptor.sql.BasicBinder.bind(BasicBinder.java:93)
    at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:280)
    at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:275)
    at org.hibernate.type.ComponentType.nullSafeSet(ComponentType.java:358)
    at org.hibernate.param.NamedParameterSpecification.bind(NamedParameterSpecification.java:66)
    at org.hibernate.loader.hql.QueryLoader.bindParameterValues(QueryLoader.java:609)
    at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1874)
    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1835)
    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1815)
    at org.hibernate.loader.Loader.doQuery(Loader.java:899)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:341)
    at org.hibernate.loader.Loader.doList(Loader.java:2522)
    at org.hibernate.loader.Loader.doList(Loader.java:2508)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2338)
    at org.hibernate.loader.Loader.list(Loader.java:2333)
    at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:490)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:355)
    at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:195)
    at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1269)
    at org.hibernate.internal.QueryImpl.list(QueryImpl.java:101)
    at mypkg.dao.GenericHibernateDao._exists(GenericHibernateDao.java:205)
    at mypkg.dao.impl.HibernateBasedNodeDaoImpl.exists(HibernateBasedNodeDaoImpl.java:95)
    at mypkg.dao.impl.HibernateBasedNodeDaoImplTest.exists(HibernateBasedNodeDaoImplTest.java:168)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
    at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74)
    at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:83)
    at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:88)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

Classes:

@Embeddable
public class NodePK implements Serializable {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    @Basic(optional = false)
    @Column(name = "NETWORKID")
    private String networkid;
    @Basic(optional = false)
    @Column(name = "NODEID")
    private String nodeid;


   //setter getters
}

Node has

@EmbeddedId
    protected NodePK nodePK;

SQL/HQL

131987 [main] DEBUG org.hibernate.hql.internal.ast.QueryTranslatorImpl  - HQL: select id FROM mypkg.NodeModel obj  WHERE obj.id in (:ids) 
131988 [main] DEBUG org.hibernate.hql.internal.ast.QueryTranslatorImpl  - SQL: select nodemodel0_.NETWORKID as col_0_0_, nodemodel0_.NODEID as col_0_1_ from NODE nodemodel0_ where nodemodel0_.NETWORKID=? and nodemodel0_.NODEID=?

What is the issue?

Foi útil?

Solução

Found the issue .I was constructing a list of NodePks and then doing nodePkList.toArray() .I was then passing this to someother method which accepted Serialize ... When i changed it from Serialize ... to List it worked. I think there was some toString happening somewhere someHow .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top