我正在实现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=?
问题是什么?
答案 0 :(得分:0)
发现问题。我正在构建NodePks列表,然后执行nodePkList.toArray()。然后将其传递给另一个接受Serialize的方法...当我将它从Serialize ...更改为List时它工作了。我觉得有些东西发生在某些地方。