Java/Hibernate:无法解析具有嵌套对象标准的属性
我在使用Hibernate标准时遇到问题。我试图创建一个条件,在这里我查看查询返回的类的成员对象的id 例如: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
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) );