[英]IllegalArgumentException: argument type mismatch in Hibernate
出乎意料的是,我開始在hibernate中獲得“IllegalArgumentException:argument type mismatch”。 hibernate實體工作了很長時間,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)
翻譯:Hibernate在嘗試調用setter方法時提供了錯誤類型的參數。
我的第一步是找出哪個setter(例如通過在eclipse中調試應用程序,設置異常斷點,並在達到斷點時檢查堆棧變量)。
編輯:映射屬性qs
的setter的簽名是什么? 它應該采用Set<Q>
。
解決方案是在查詢執行中使用“ 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(它們現在已被棄用)。
我聽說過由於基礎數據庫字段更改(例如日期到時間戳)而發生這種情況。 如果您能夠進行測試,或者像Sands建議那樣檢查.hbm或注釋,則可能值得恢復數據庫更改。
那么,你修改了一個hibernate映射文件而不修改實體? 我猜qs
屬性已經存在了。 但它是java.util.Set
(因為你使用<set>
來映射你的集合 )?
有時它發生在類型不兼容的時候。 對於MySQL查詢,必須進行轉換后才能進行轉換。
select CAST(sum(hours) AS SIGNED) ...
希望這會幫助人們遇到與JPA類似的問題(JPA-Hibernate for exact)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.