获取Hibernate异常:org.hibernate.QueryException: 无法解析属性

4

我有一个带有复合键属性的表。

为此,我已经创建了两个用于Hibernate注释映射的bean。

现在,保存、更新和删除都可以正常工作。

但是当我使用某些条件进行获取时,它会抛出“无法解析属性”异常。

我的Beans如下:

WBList.java

@Entity
public class WBList {

    private WBListPK id;
    private String wb;

    @Id
    public WBListPK getId() {
        return id;
    }
    public void setId(WBListPK id) {
        this.id = id;
    }
    @Column(name = "wb")
    public String getWb() {
        return wb;
    }
    public void setWb(String wb) {
        this.wb = wb;
    }
}

WBListPK.java

@Embeddable
public class WBListPK implements Serializable {

    private int rid;
    private int sid;

    public WBListPK() {
    }
    public WBListPK(Integer rid, Integer sid) {
        this.rid = rid;
        this.sid = sid;
    }
    public int getRid() {
        return rid;
    }
    public void setRid(int rid) {
        this.rid = rid;
    }
    public int getSid() {
        return sid;
    }
    public void setSid(int sid) {
        this.sid = sid;
    }
}

我的DAO的FindByAll方法如下:

public List<WBList> findByAll(final WBListPK wbListPK, final String wb) {
        List results = null;
        results = this.hibernateTemplate.executeFind(new HibernateCallback() {

            public Object doInHibernate(Session session)
                    throws HibernateException, SQLException {

                Criteria criteria = session.createCriteria(WBList.class);

                if (wb != null) {
                    criteria.add(Expression.like("wb", wb));
                }

                if(wbListPK.getRid()!=0){
                    criteria.add(Expression.eq("rid", wbListPK.getRid()));
                }
                if(wbListPK.getSid()!=0){
                    criteria.add(Expression.eq("sid", wbListPK.getSid()));
                }
                return criteria.list();
            }
        });

        return results;
    }

我正在从我的控制器调用此findByAll方法,代码如下:

 WBListPK wbListPK = new WBListPK();
 WBList wbList = new WBList();
 wbListPK.setRid(10);
 wbListPK.setSid(20);
 List<WBList> wbListList = this.wbListSecurityProcessor.findByAll(wbListPK, "b");
 System.out.println("wbListList = "+wbListList);

当我执行上面的代码时,它会给我以下异常(带有堆栈跟踪):
 org.springframework.orm.hibernate3.HibernateQueryException: could not resolve property: rid of: com.sufalam.mailserver.bean.WBList; nested exception is org.hibernate.QueryException: could not resolve property: rid of: com.sufalam.mailserver.bean.WBList
    org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:655)
    org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:412)
    org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:411)
    org.springframework.orm.hibernate3.HibernateTemplate.executeFind(HibernateTemplate.java:343)
    com.sufalam.mailserver.dao.WBListDao.findByAll(WBListDao.java:42)
    com.sufalam.mailserver.business.WBListProcessor.findByAll(WBListProcessor.java:33)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    java.lang.reflect.Method.invoke(Method.java:597)
    org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:307)
    org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:196)
    $Proxy113.findByAll(Unknown Source)
    com.sufalam.mailserver.business.security.WBListSecurityProcessor.findByAll(WBListSecurityProcessor.java:28)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    java.lang.reflect.Method.invoke(Method.java:597)
    org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:307)
    org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:196)
    $Proxy120.findByAll(Unknown Source)
    com.sufalam.mailserver.presentation.web.WBListManageController.handleRequest(WBListManageController.java:65)
    org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:48)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:781)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:726)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:636)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:545)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)

root cause

org.hibernate.QueryException: could not resolve property: rid of: com.sufalam.mailserver.bean.WBList
    org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:44)
    org.hibernate.persister.entity.AbstractPropertyMapping.toType(AbstractPropertyMapping.java:38)
    org.hibernate.persister.entity.AbstractEntityPersister.getSubclassPropertyTableNumber(AbstractEntityPersister.java:1379)
    org.hibernate.persister.entity.BasicEntityPropertyMapping.toColumns(BasicEntityPropertyMapping.java:31)
    org.hibernate.persister.entity.AbstractEntityPersister.toColumns(AbstractEntityPersister.java:1354)
    org.hibernate.loader.criteria.CriteriaQueryTranslator.getColumns(CriteriaQueryTranslator.java:434)
    org.hibernate.loader.criteria.CriteriaQueryTranslator.getColumnsUsingProjection(CriteriaQueryTranslator.java:394)
    org.hibernate.criterion.SimpleExpression.toSqlString(SimpleExpression.java:45)
    org.hibernate.loader.criteria.CriteriaQueryTranslator.getWhereCondition(CriteriaQueryTranslator.java:334)
    org.hibernate.loader.criteria.CriteriaJoinWalker.<init>(CriteriaJoinWalker.java:90)
    org.hibernate.loader.criteria.CriteriaJoinWalker.<init>(CriteriaJoinWalker.java:59)
    org.hibernate.loader.criteria.CriteriaLoader.<init>(CriteriaLoader.java:69)
    org.hibernate.impl.SessionImpl.list(SessionImpl.java:1554)
    org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:283)
    com.sufalam.mailserver.dao.WBListDao$1.doInHibernate(WBListDao.java:59)
    org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:406)
    org.springframework.orm.hibernate3.HibernateTemplate.executeFind(HibernateTemplate.java:343)
    com.sufalam.mailserver.dao.WBListDao.findByAll(WBListDao.java:42)
    com.sufalam.mailserver.business.WBListProcessor.findByAll(WBListProcessor.java:33)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    java.lang.reflect.Method.invoke(Method.java:597)
    org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:307)
    org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:196)
    $Proxy113.findByAll(Unknown Source)
    com.sufalam.mailserver.business.security.WBListSecurityProcessor.findByAll(WBListSecurityProcessor.java:28)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    java.lang.reflect.Method.invoke(Method.java:597)
    org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:307)
    org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:196)
    $Proxy120.findByAll(Unknown Source)
    com.sufalam.mailserver.presentation.web.WBListManageController.handleRequest(WBListManageController.java:65)
    org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:48)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:781)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:726)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:636)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:545)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)

如果有任何解决方案,请帮助我。

提前感谢。

2个回答

5
"rid"和"sid"是复合标识符("WbListPK")的属性,而不是实体本身的属性。因此,您需要相应地引用它们。
if(wbListPK.getRid()!=0){
  criteria.add(Expression.eq("id.rid", wbListPK.getRid()));
}
if(wbListPK.getSid()!=0){
  criteria.add(Expression.eq("id.sid", wbListPK.getSid()));
}

注意前缀为id.。请参阅 Hibernate 文档中的where 子句引用 id 属性章节,了解更多详细信息和示例(它们涉及 HQL,但大部分内容也适用于 Criteria API)。

对于那些因为在使用带有@EmbeddedId的类的条件查询中出现别名问题而无法解决的人,请参见:http://opensource.atlassian.com/projects/hibernate/browse/HHH-4587。 - benvolioT

4

虽然这并不是对这个问题的具体回答,但可能会帮助其他遇到类似错误的人。对于我来说,问题在于大小写敏感性。换句话说,在您提供的条件中,字符串属性名称必须与映射文件中的名称匹配,例如:

criteria.add(Restrictions.eq("patient", patient));

由于我在此处使用了“Patient”,而我的实体具有属性“Patient”并且数据库表具有字段“idPatient”,而我在映射文件中命名关系为“patient”,因此出现了错误。

仅供参考,也许这会帮助未来的一些人,因为我通过在谷歌输入错误进入了这个线程。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接