IllegalArgumentException: несоответствие типов аргументов в Hibernate - PullRequest
11 голосов
/ 16 января 2010

Внезапно я начал получать «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)

Ответы [ 5 ]

9 голосов
/ 16 января 2010

Перевод: Hibernate предоставляет аргумент неправильного типа при попытке вызвать метод установки.

Моим первым шагом было бы выяснить, какой это метод установки (например, путем отладки приложения в eclipse, установки точки останова исключения и проверки переменных стека после достижения точки останова).

Редактировать: Какая подпись установщика для сопоставленного свойства qs? Это должно занять Set<Q>.

3 голосов
/ 10 ноября 2012

Решением является использование " 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 голосов
/ 16 января 2010

Итак, вы изменили файл отображения спящего режима без изменения сущности? Я предполагаю, что свойство qs уже было там. Но это java.util.Set (как вы использовали <set> для отображения вашей коллекции )?

3 голосов
/ 16 января 2010

Я слышал, что это происходит из-за изменений базовых полей базы данных (таких как дата и время). Возможно, стоит отменить изменения базы данных, если вы можете и протестировать ее, или проверить .hbm или аннотации, как предложил Сэндс.

0 голосов
/ 26 марта 2018

Иногда это происходит, когда типы несовместимы. Для запроса MySQL необходимо выполнить следующее преобразование для совместимости.

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

Надеюсь, что это поможет людям столкнуться с подобной проблемой с JPA (JPA-Hibernate для точного).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...