Java/Hibernate:无法解析具有嵌套对象标准的属性

Java/Hibernate:无法解析具有嵌套对象标准的属性,java,hibernate,Java,Hibernate,我在使用Hibernate标准时遇到问题。我试图创建一个条件,在这里我查看查询返回的类的成员对象的id 例如: Criteria crit = session.createCriteria(Enquiry.class); crit.add(Expression.eq("lecture.admin.id", userId));` 这样做的结果是一个例外: org.hibernate.QueryException:无法解析属性:teaching.admin.id of:xxx.yyy.Enquir

我在使用Hibernate标准时遇到问题。我试图创建一个条件,在这里我查看查询返回的类的成员对象的id

例如:

Criteria crit = session.createCriteria(Enquiry.class);
crit.add(Expression.eq("lecture.admin.id", userId));`
这样做的结果是一个例外:
org.hibernate.QueryException:无法解析属性:teaching.admin.id of:xxx.yyy.Enquiry

查询
类确实包含讲座变量,而讲座变量又包含admin变量。我试过使用
touch.id
,效果很好

像这样沿对象层次结构向下移动的层数有限制吗

谢谢

代码片段:

public class Lecture extends TransferItem {  
  private User admin;  
  public User getAdmin() {  
    return admin;  
  }
}
“User”类扩展了
Person
类,该类又扩展了
类,该类具有
getId()
方法:

public Integer getId() {  
  if (id != null) {  
    return id;  
  }  
  return TransferBean.NOT_SET;  
}
从Hibernate映射XML:

<class name="User" table="user">  
  <id column="user_id" name="id">
    <generator class="increment"/>  
  </id>
  ...

<class name="Lecture" table="lecture">  
  <many-to-one class="User" column="user_fk" lazy="false" name="admin"/>`  

当您深入到对象图中时,确实会遇到问题。我通常通过创建如上所示的别名来解决这个问题。

您不能直接在CriteriaAPI中使用嵌套路径(与HQL不同)。相反,您需要从第一个非根实体开始,在每个“entity.property”对上创建嵌套的条件实例或定义别名:

Criteria criteria = session.createCriteria(Enquiry.class)
 .createAlias("lecture", "l")
 .createAlias("l.admin", "a")
 .add( Restrictions.eqProperty("a.id", userId) );
请注意,第一个属性没有前缀,因为它属于根实体(
Enquiry
),其他属性的前缀是上一级别名。详情如下

还请注意,
id
在关联方面是一个特殊属性;在您的案例中,
user_fk
是位于
讲座
表中的一列。因此,应该可以(前提是您发布的映射是准确的)将上述标准重写为:

Criteria criteria = session.createCriteria(Enquiry.class)
 .createAlias("lecture", "l")
 .add( Restrictions.eqProperty("l.admin.id", userId) );

因此消除了额外的连接。

我尝试了这个方法,但后来却遇到了一个SQLGrammarException:原因:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:where子句中的未知列'catecheadm1.user\u id'有什么想法吗?这看起来像是来自数据库的错误,在“user”表中没有“user\u id”列。您确定数据库表中有此列吗?也许数据库上的列也被称为“id”,如果是这种情况,那么hibernate映射就是问题所在。我将用户数据库表添加到了问题中,谢谢!总是像往常一样有教育意义@chssply76当你面对自己时的那种感觉。。好的,清晰的答案,让事情突然进入你的脑海!FK讲座是否是问询表中的一列?根据删除的部分“.createAlias(“l.admin”,“a”)”,讲座别名也可以删除吗?我不确定这个答案期望的Hibernate版本是什么,但我认为在Hibernate 5中应该使用
eq()
,而不是
eqProperty()
Criteria criteria = session.createCriteria(Enquiry.class)
 .createAlias("lecture", "l")
 .createAlias("l.admin", "a")
 .add( Restrictions.eqProperty("a.id", userId) );
Criteria criteria = session.createCriteria(Enquiry.class)
 .createAlias("lecture", "l")
 .add( Restrictions.eqProperty("l.admin.id", userId) );