非法参数异常:休眠中的参数类型不匹配

2022-09-04 19:44:46

突然之间,我开始在休眠状态中得到“IllegalArgumentException:参数类型不匹配”。休眠实体工作了相当长一段时间,svn日志确认代码完好无损。

可能的情况如何?
这是例外的一部分

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

翻译:Hibernate 在尝试调用 setter 方法时提供错误类型的参数。

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

编辑:映射属性的 setter 的签名是什么?它应该需要一个.qsSet<Q>


答案 2

解决方案是在查询执行中使用“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(它们现在已被弃用)。


推荐