Java 休眠条件别名未加入

Java 休眠条件别名未加入,java,sql,hibernate,join,criteria-api,Java,Sql,Hibernate,Join,Criteria Api,我有一个实体答案,它有一个复合id AnswerId,它有一个Person实体和一个Question实体,分别有personId和questionId的字符串id。此外,问题实体还有一个字段questionText 如果我尝试以下方法: Criteria criteria = session.createCriteria(AnswerEntity.class); criteria.add(Restrictions.eq("answerId.person.personId", personId))

我有一个实体答案,它有一个复合id AnswerId,它有一个Person实体和一个Question实体,分别有personId和questionId的字符串id。此外,问题实体还有一个字段questionText

如果我尝试以下方法:

Criteria criteria = session.createCriteria(AnswerEntity.class);
criteria.add(Restrictions.eq("answerId.person.personId", personId));
criteria.add(Restrictions.eq("answerId.question.questionId", questionId));
它的工作原理是根据提供的personId和questionId过滤结果

但是,如果我尝试:

Criteria criteria = session.createCriteria(AnswerEntity.class);
criteria.add(Restrictions.eq("answerId.person.personId", personId)); 
criteria.add(Restrictions.like("answerId.question.questionText",questionText));
它失败了。它表示找不到questionText,生成的SQL显示了原因:

SELECT this_.PERSON_ID AS PERSON6_5_0_,
  this_.QUESTION_ID    AS QUESTION5_5_0_,
  this_.THEIR_ANSWER   AS THEIR3_5_0_,
FROM ANSWER this_
WHERE q1_.QUESTION_TEXT LIKE ?
AND this_.PERSON_ID=?
如何连接答案和问题,以便访问问题文本?我尝试添加一个别名,如

criteria.createAlias("answerId.question", "q"); 
criteria.add(Restrictions.like("q.questionText", "%" + text + "%"));
但这似乎不起作用。有谁能帮我解释一下我做错了什么

编辑:奇怪的是,Person实体也有一组答案,这样我就可以对Person进行查询,并使用诸如
“Answers.answerId.question.questionText”
之类的限制进行过滤,它实际上是有效的。我不知道有什么不同

编辑:我的实体(没有getter/setter/equals/etc)


只是胡乱猜测,试试看:

criteria.createAlias("question.questionText", "qText"); 
criteria.add(Restrictions.like("answerId.qText", "%" + text + "%"));

编辑:这背后的原因(使野生猜测成为有根据的猜测;)是您不需要别名或
子标准来导航到嵌入属性,如
myembedded.myProperty
。您需要别名或
子标准
来导航到相关实体的属性,如
myRelatedEntity。myProperty

您可以发布域类定义吗?您可以删除PersonEntity,因为它在没有该限制的情况下失败。我猜,不知何故,此复合键使hibernate无法实现它需要连接答案表和问题表。您是否依赖此ER/域模型和复合主键?根据我的经验,这可能会变得相当混乱,简单的代理键更容易处理。我确实依赖它,因为它使一些事情变得更容易。我想我会放弃通过标准来做这件事,因为通过HQL做这件事花了整整两分钟的时间,根据我的谷歌搜索,Hibernate甚至可能不支持它。遗憾的是,这不起作用,但我没有尝试过。我想我只是打算使用HQL。
criteria.createAlias("question.questionText", "qText"); 
criteria.add(Restrictions.like("answerId.qText", "%" + text + "%"));