属性的query.list休眠异常获取方法

时间:2020-04-27 21:15:28

标签: java hibernate

我正在尝试实现一种简单的方法,该方法从具有由类定义的列的表中获取一些数据。

我实现了一种根据某些条件提取某些数据的方法,但是当设置了与Composite-id有关的条件时,我会收到异常消息。

这是方法:

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()!=nullfalse但条件user.getDescription()!=nulltrue时,不会发生例外。

问题似乎不存在于方法retriveUserInTransaction中。也许这是与ApplicationUserIdApplicationUser之间的关系有关的问题,但我不明白自己在哪里错了。

这是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

0 个答案:

没有答案