【问题标题】:HQL query throws classCastExceptionHQL 查询抛出 classCastException
【发布时间】:2014-05-03 08:35:59
【问题描述】:

我正在实现一个exists 函数,该函数检查具有给定 ID 的实体是否存在于数据库中:

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;
    }

我通过传递表的主键来调用该表。请注意,主键是复合主键。但随后它会在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)

类:

@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
}

节点有

@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=?

有什么问题?

【问题讨论】:

  • 您是否将Strings 的列表作为ids 参数而不是mypkg.NodePKs 传递?我想不是,只是为了检查..
  • 另外,如果您在要查询的类上发布您的休眠配置映射文件或注释会很好
  • @perencia 不,我没有通过 List .
  • 用于hibernate中的复合键映射[参考这个问题][1] [1]:stackoverflow.com/questions/3585034/…
  • @all :发现问题。我正在构建一个 NodePks 列表,然后执行 nodePkList.toArray() 。然后我将其传递给接受序列化的其他方法...当我将其从序列化 ... 到 List 它工作。我认为某处发生了一些 toString 。

标签: java sql hibernate orm


【解决方案1】:

发现了问题。我正在构建一个 NodePks 列表,然后执行 nodePkList.toArray() 。然后我将它传递给接受序列化的其他方法......当我将它从序列化......更改为 List 它工作.我认为某处发生了一些 toString someHow 。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-15
    • 2018-10-11
    • 2018-07-20
    • 2015-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-02
    相关资源
    最近更新 更多