Hibernate 使用hql'或'
我不知道我错过了什么。我正在尝试按如下方式运行查询:Hibernate 使用hql'或',hibernate,hql,Hibernate,Hql,我不知道我错过了什么。我正在尝试按如下方式运行查询: String query = "select e from Event e where (eventType.operation='LIKE' and relatedPost.creatorPerson.personId=:person1Id)" + " or (eventEntity.relatedEntity='PERSON' and eventType.operation='FOLLOW' and rel
String query = "select e from Event e where (eventType.operation='LIKE' and relatedPost.creatorPerson.personId=:person1Id)"
+ " or (eventEntity.relatedEntity='PERSON' and eventType.operation='FOLLOW' and relatedPerson.personId=:personId)"
+ " order by creationDate desc";
beginTx();
Query q = session.createQuery(query);
q.setInteger("personId", id1);
q.setInteger("personId1", id2);
List<Event> events = q.list();
commitTx();
当我分别查询“或”的每一面时,我会得到正确的结果。但当运行上述整个查询时,我只得到“or”左侧的结果
有什么帮助吗?好的,现在我很确定我的评论 问题是relatedPost.creatorPerson将导致一个内部连接,实际上甚至是两个,因此当relatedPost或relatedPost.creatorPerson为空时,您将无法获得或的正确部分的任何结果。如果显式指定一些左连接,则应得到一个结果:
select e from Event e
left join e.relatedPost as rp
left join rp.creatorPerson as cp
where (eventType.operation='LIKE' and cp.personId=:person1Id)
or (eventEntity.relatedEntity='PERSON' and eventType.operation='FOLLOW' and relatedPerson.personId=:personId) order by creationDate desc
好吧,现在我很肯定我的评论 问题是relatedPost.creatorPerson将导致一个内部连接,实际上甚至是两个,因此当relatedPost或relatedPost.creatorPerson为空时,您将无法获得或的正确部分的任何结果。如果显式指定一些左连接,则应得到一个结果:
select e from Event e
left join e.relatedPost as rp
left join rp.creatorPerson as cp
where (eventType.operation='LIKE' and cp.personId=:person1Id)
or (eventEntity.relatedEntity='PERSON' and eventType.operation='FOLLOW' and relatedPerson.personId=:personId) order by creationDate desc
我猜relatedPost.creatorPerson将导致一个内部连接,实际上甚至是两个,因此,当relatedPost或relatedPost.creatorPerson为null时,您将无法获得或的正确部分的任何结果。事实上,我是hql新手,不知道如何修复它。但当我切换“或”的两边时,我仍然会得到左边的结果。如果我记得正确,您必须显式指定一个左连接:从事件e中选择e left join e.relatedPost作为rp left join rp.creatorPerson作为cp,其中eventType.operation='LIKE'和cp.personId=:person1Id或eventEntity.relatedEntity='PERSON'和eventType.operation='FOLLOW'和relatedPerson.personId=:personId order by creationDate desc我猜relatedPost.creatorPerson将导致一个内部连接,实际上甚至是两个,因此当relatedPost或relatedPost.creatorPerson为空时,您将不会得到任何结果去修理它。但当我切换“或”的两边时,我仍然会得到左边的结果。如果我记得正确,您必须显式指定一个左连接:从事件e中选择e left join e.relatedPost作为rp left join rp.creatorPerson作为cp,其中eventType.operation='LIKE'和cp.personId=:person1Id或eventEntity.relatedEntity='PERSON'和eventType.operation='FOLLOW'和relatedPerson.personId=:personId order by creationDate desc