Java 休眠条件别名未加入
我有一个实体答案,它有一个复合id AnswerId,它有一个Person实体和一个Question实体,分别有personId和questionId的字符串id。此外,问题实体还有一个字段questionText 如果我尝试以下方法: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))
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 + "%"));