Java IllegalArgumentException:Hibernate中的参数类型不匹配
突然,我在hibernate中得到了“IllegalArgumentException:参数类型不匹配”。hibernate实体工作了相当长的一段时间,svn日志确认代码是完整的 可能是什么情况?Java IllegalArgumentException:Hibernate中的参数类型不匹配,java,hibernate,orm,Java,Hibernate,Orm,突然,我在hibernate中得到了“IllegalArgumentException:参数类型不匹配”。hibernate实体工作了相当长的一段时间,svn日志确认代码是完整的 可能是什么情况? 这是部分例外 Jan 16, 2010 10:47:09 PM org.apache.catalina.core.StandardWrapperValve invoke SEVERE: Servlet.service() for servlet Faces Servlet threw exceptio
这是部分例外
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)
我听说这种情况是由于底层数据库字段的更改(例如从日期到时间戳)造成的。如果您能够恢复并测试数据库更改,或者按照Sands的建议检查.hbm或注释,那么恢复数据库更改可能是值得的。翻译:Hibernate在尝试调用setter方法时提供了错误类型的参数 我的第一步是找出哪个setter(例如,在eclipse中调试应用程序,设置异常断点,并在到达断点后检查堆栈变量)
编辑:映射属性
qs
的setter签名是什么?它应该需要一个集合
那么,您是否在不修改实体的情况下修改了hibernate映射文件?我想那时,qs
属性已经存在了。但是它是一个java.util.Set
(正如您使用的
to)?解决方案是在查询执行中使用“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();
List users=sessionFactory.getCurrentSession()
.createQuery(查询)
.list();
使用addScalar:
List<UserEntity> users = sessionFactory.getCurrentSession()
.createQuery(query)
.addScalar("id",LongType.INSTANCE)
.addScalar("name",StringType.INSTANCE)
.list();
List users=sessionFactory.getCurrentSession()
.createQuery(查询)
.addScalar(“id”,LongType.INSTANCE)
.addScalar(“名称”,StringType.INSTANCE)
.list();
注意:在LongType.INSTANCE之前,有Hibernate.LONG和Hibernate.STRING(它们现在已被弃用)。有时在类型不兼容时会发生这种情况。对于MySQL查询,为了兼容性,必须进行以下转换
select CAST(sum(hours) AS SIGNED) ...
希望这能帮助人们在JPA(JPA Hibernate)中遇到类似的问题。对数据库表有任何更改吗?您可能仍然希望检查.hbm文件,以查看这些更改是否重叠?@Kaleb u r right。将此代码添加到hbm中会产生此错误
您知道原因吗?@Kaleb u r正确。将此代码添加到hbm中会导致此错误
您知道原因吗?