2010-01-16 137 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(他們已被棄用現在)。