Я пытаюсь реализовать простой метод, который получает некоторые данные из таблицы со столбцом, определенным классом.
Я реализовал метод, который извлекает некоторые данные в соответствии с некоторыми условиями, но я получаю исключение, когда установлено условие, относящееся к составному идентификатору.
Это метод:
private List<ApplicationUser> retriveUserInTransaction(ApplicationUser user) {
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<ApplicationUser> criteriaQuery = builder.createQuery(ApplicationUser.class);
Root<ApplicationUser> root = criteriaQuery.from(ApplicationUser.class);
List<Predicate> predicateList = new ArrayList<Predicate>();
if(user.getId()!=null) {
predicateList.add(builder.like(root.get("id"),"%"+user.getId().token+"%"));
}
if(user.getDescription()!=null) {
predicateList.add(builder.like(root.get("description"),"%"+user.getDescription()+"%"));
}
List<ApplicationUser> result= new ArrayList<ApplicationUser>();
criteriaQuery.where(builder.and(predicateList.toArray(new Predicate[predicateList.size()])));
Query<ApplicationUser> query = session.createQuery(criteriaQuery);
result= query.list();
return result;
}
во время выполнения, когда user.getId()!=null
я получаю исключение на query.list
строку
22:07:43.332 [main] ERROR org.hibernate.property.access.spi.GetterMethodImpl - HHH000122: IllegalArgumentException in class: com.test.model.ApplicationUserId, getter method of property: token
Но я не понимаю почему. Например, когда условие user.getId()!=null
равно false
, а условие user.getDescription()!=null
равно true
, исключение не возникает.
Кажется, проблема не в методе retriveUserInTransaction
. Возможно, это проблема, связанная с отношениями между ApplicationUserId
и ApplicationUser
, но я не могу понять, где я ошибаюсь.
Это ApplicationUser
класс:
public class ApplicationUser implements Serializable{
private static final long serialVersionUID = 1L;
private ApplicationUserId id = new ApplicationUserId();
private String description = null;
public ApplicationUserId getId() {
return id;
}
public void setId(ApplicationUserId id) {
this.id = id;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
Это ApplicationUserId
класс:
public class ApplicationUserId implements Serializable{
private static final long serialVersionUID = 1L;
public String token=null;
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
@Override
-------- equals and hashCode
}
И это ApplicationUser.hbn.xml
:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.test.model.ApplicationUser" table="ApplicationUser">
<composite-id name="id" class="com.test.model.ApplicationUserId">
<key-property name="token" type="java.lang.String">
<column name="token" length="200"/>
</key-property>
</composite-id>
<property name="description" type="java.lang.String">
<column name="description" length="255"/>
</property>
</class>
</hibernate-mapping>
А это StackTrace
Hibernate:
/* select
generatedAlias0
from
ApplicationUser as generatedAlias0
where
generatedAlias0.id like :param0 */ select
applicatio0_.token as token1_0_,
applicatio0_.description as descript2_0_
from
ApplicationUser applicatio0_
where
applicatio0_.token like ?
15:12:16.632 [main] ERROR org.hibernate.property.access.spi.GetterMethodImpl - HHH000122: IllegalArgumentException in class: com.Test.model.ApplicationUserId, getter method of property: token
15:12:16.640 [main] DEBUG org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl - JDBC transaction marked for rollback-only (exception provided for stack trace)
java.lang.Exception: exception just for purpose of providing stack trace
at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.markRollbackOnly(JdbcResourceLocalTransactionCoordinatorImpl.java:324)
at org.hibernate.engine.transaction.internal.TransactionImpl.markRollbackOnly(TransactionImpl.java:203)
at org.hibernate.internal.AbstractSharedSessionContract.markForRollbackOnly(AbstractSharedSessionContract.java:396)
at org.hibernate.internal.ExceptionConverterImpl.handlePersistenceException(ExceptionConverterImpl.java:297)
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:155)
at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1542)
at org.hibernate.query.criteria.internal.compile.CriteriaQueryTypeQueryAdapter.list(CriteriaQueryTypeQueryAdapter.java:96)
at com.Test.dao.DaoHibernate.retriveUserInTransaction(DaoHibernate.java:395)
at com.Test.dao.DaoHibernate.retrieve(DaoHibernate.java:377)
at com.Test.dao.TestDao.testToken(TestDao.java:78)
at com.Test.dao.TestDao.main(TestDao.java:39)
javax.persistence.PersistenceException: org.hibernate.PropertyAccessException: IllegalArgumentException occurred calling getter of com.Test.model.ApplicationUserId.token
15:12:16.643 [main] DEBUG org.hibernate.engine.transaction.internal.TransactionImpl - rolling back
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:154)
at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1542)
at org.hibernate.query.criteria.internal.compile.CriteriaQueryTypeQueryAdapter.list(CriteriaQueryTypeQueryAdapter.java:96)
at com.Test.dao.DaoHibernate.retriveUserInTransaction(DaoHibernate.java:395)
at com.Test.dao.DaoHibernate.retrieve(DaoHibernate.java:377)
at com.Test.dao.TestDao.testToken(TestDao.java:78)
at com.Test.dao.TestDao.main(TestDao.java:39)
Caused by: org.hibernate.PropertyAccessException: IllegalArgumentException occurred calling getter of com.Test.model.ApplicationUserId.token
at org.hibernate.property.access.spi.GetterMethodImpl.get(GetterMethodImpl.java:65)
at org.hibernate.tuple.component.AbstractComponentTuplizer.getPropertyValue(AbstractComponentTuplizer.java:59)
at org.hibernate.tuple.component.AbstractComponentTuplizer.getPropertyValues(AbstractComponentTuplizer.java:65)
at org.hibernate.tuple.component.PojoComponentTuplizer.getPropertyValues(PojoComponentTuplizer.java:92)
at org.hibernate.type.ComponentType.getPropertyValues(ComponentType.java:443)
at org.hibernate.type.ComponentType.nullSafeGetValues(ComponentType.java:384)
at org.hibernate.type.ComponentType.nullSafeSet(ComponentType.java:337)
at org.hibernate.param.NamedParameterSpecification.bind(NamedParameterSpecification.java:53)
at org.hibernate.loader.hql.QueryLoader.bindParameterValues(QueryLoader.java:648)
at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:2120)
at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:2034)
at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:2012)
at org.hibernate.loader.Loader.doQuery(Loader.java:953)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:354)
at org.hibernate.loader.Loader.doList(Loader.java:2838)
at org.hibernate.loader.Loader.doList(Loader.java:2820)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2652)
at org.hibernate.loader.Loader.list(Loader.java:2647)
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:506)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:396)
at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:219)
at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1404)
at org.hibernate.query.internal.AbstractProducedQuery.doList(AbstractProducedQuery.java:1565)
at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1533)
... 5 more
Caused by: java.lang.IllegalArgumentException: object is not an instance of declaring class
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:567)
at org.hibernate.property.access.spi.GetterMethodImpl.get(GetterMethodImpl.java:42)
... 28 more