2010-01-16 135 views
8

在蓝牙中,我开始在hibernate中发现“IllegalArgumentException:参数类型不匹配”。 hibernate实体工作了很长时间,svn日志确认代码完好无损。IllegalArgumentException:Hibernate中的参数类型不匹配

可能是什么情况?
这里的例外

Jan 16, 2010 10:47:09 PM org.apache.catalina.core.StandardWrapperValve invoke 
SEVERE: Servlet.service() for servlet Faces Servlet threw exception 
java.lang.IllegalArgumentException: argument type mismatch 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.hibernate.property.BasicPropertyAccessor$BasicSetter.set(BasicPropertyAccessor.java:42) 
    at org.hibernate.tuple.entity.AbstractEntityTuplizer.setPropertyValues(AbstractEntityTuplizer.java:337) 
    at org.hibernate.tuple.entity.PojoEntityTuplizer.setPropertyValues(PojoEntityTuplizer.java:200) 
    at org.hibernate.persister.entity.AbstractEntityPersister.setPropertyValues(AbstractEntityPersister.java:3566) 
    at org.hibernate.engine.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:129) 
    at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:854) 
    at org.hibernate.loader.Loader.doQuery(Loader.java:729) 
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236) 
    at org.hibernate.loader.Loader.doList(Loader.java:2220) 
    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 org.springframework.orm.hibernate3.HibernateTemplate$30.doInHibernate(HibernateTemplate.java:930) 
    at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:419) 
    at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374) 
    at org.springframework.orm.hibernate3.HibernateTemplate.find(HibernateTemplate.java:921) 
+1

对数据库表的任何更改? – 2010-01-16 17:29:28

+0

无关的更改,是 – 2010-01-16 17:33:49

+0

仍然可能要检查您的.hbm文件以查看这些更改是否有重叠? – Sands 2010-01-16 17:36:30

回答

8

译文:当试图调用setter方法时,Hibernate提供了一个错误类型的参数。

我的第一步是找出哪个设置器(例如,通过在eclipse中调试应用程序,设置异常断点,并在达到断点时检查堆栈变量)。

编辑:映射属性qs的setter的签名是什么?它应该采取Set<Q>

+0

你说得对。这是一种错误的类型。列表而不是设置 – 2010-01-16 19:06:19

3

我听说过这种情况发生的部分原因是由于底层数据库领域的变化(如日期戳)。如果你能够测试它,或者按照Sands的建议检查.hbm或annotations,那么可能需要恢复数据库更改。

+0

@Kaleb你对。添加此代码到hbm中创建了此错误:'你知道为什么它可能吗? – 2010-01-16 18:40:20

3

因此,您修改了一个hibernate映射文件而不修改实体?我猜qs属性已经存在了。但它是一个java.util.Set(因为您使用<set>map your collection)?

1

解决方案是在您的查询执行中使用“addScalar”。

假设你的实体是用户:

@Entity 
@Table(name="user") 
@DynamicUpdate(value=true) 
public class UserEntity implements Serializable{  

@Id @GeneratedValue(strategy = GenerationType.AUTO) 
@Column(name="id",updatable=false) 
private Long id; 

@Column(name="name",nullable=false,length=20) 
private String name; 
.... 
} 

而不是做:

List<UserEntity> users = sessionFactory.getCurrentSession() 
     .createQuery(query) 
     .list(); 

使用addScalar:

List<UserEntity> users = sessionFactory.getCurrentSession() 
    .createQuery(query) 
    .addScalar("id",LongType.INSTANCE) 
    .addScalar("name",StringType.INSTANCE)   
    .list(); 

注意:之前LongType.INSTANCE,有是Hibernate.LONG和Hibernate.STRING(他们已被弃用现在)。