【问题标题】:IllegalArgumentException: argument type mismatch in HibernateIllegalArgumentException:Hibernate 中的参数类型不匹配
【发布时间】:2010-01-16 17:25:31
【问题描述】:

出乎意料的是,我开始在休眠中收到“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)

【问题讨论】:

  • 对数据库表有任何更改吗?
  • 您仍然可能想检查您的 .hbm 文件以查看这些更改是否重叠?
  • @Kaleb 你说得对。将此代码添加到 hbm 会产生此错误 <set inverse="true" name="qs" sort="unsorted" lazy="false"> <key> <column name="q_id" not-null="false"/> </key> <one-to-many class="com.comp.domain.Q" /> </set> 你知道为什么会这样吗?

标签: java hibernate orm


【解决方案1】:

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

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

编辑:映射属性qs 的设置器的签名是什么?应该是Set<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(现在已弃用)。

    【讨论】:

      【解决方案3】:

      我听说这是由于基础数据库字段更改(例如日期到时间戳)而发生的。如果您能够并对其进行测试,或者按照 Sands 的建议检查 .hbm 或注释,则可能值得还原数据库更改。

      【讨论】:

      • @Kaleb 你说得对。将此代码添加到 hbm 会导致此错误 &lt;set inverse="true" name="qs" sort="unsorted" lazy="false"&gt; &lt;key&gt; &lt;column name="q_id" not-null="false"/&gt; &lt;/key&gt; &lt;one-to-many class="com.comp.domain.Q" /&gt; &lt;/set&gt; 你知道为什么会这样吗?
      【解决方案4】:

      那么,您修改了休眠映射文件而不修改实体?我猜qs 属性已经在那里了。但它是java.util.Set(就像您使用&lt;set&gt;map your collection)吗?

      【讨论】:

        【解决方案5】:

        有时当类型不兼容时会发生这种情况。对于 MySQL 查询,必须进行强制转换后的兼容性。

        select CAST(sum(hours) AS SIGNED) ...
        

        希望这将帮助人们遇到与 JPA 类似的问题(确切地说是 JPA-Hibernate)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-09-19
          • 1970-01-01
          • 1970-01-01
          • 2016-12-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多