Criteria cats = sess.createCriteria(Cat.class).add( Restrictions.like("name", "jerry");
Criteria kittens = cats.createCriteria("kittens");
List catList = cats.list();
上面的结果中仅包含带有相关小猫的猫。如果“小猫”外键为空,则满足“ name = jerry”限制的猫将不包括在结果中。这似乎很奇怪,因为我没有对“小猫”设置任何限制。我有两个问题:为什么会发生这种现象?避免这种行为并使猫返回的理想方法是什么,无论它们是否有小猫(是否为createAlias)?
出现此问题的原因是,使用条件条件,我可能想执行以下操作:
if (someCondition) kittens.add(restriction);
因此,从实践的角度来看,提前建立“小猫”标准是有意义的,尽管它并没有达到我的预期。
最佳答案
对于HQL和Criteria,无论何时指定隐式联接,Hibernate都会假定您需要INNER JOIN。而INNER JOIN则过滤掉null。
从猫到小猫,您都需要使用左联接。
criteria.addAlias("kittens","kitten", CriteriaSpecification.LEFT_JOIN);
关于java - Hibernate createCriteria()排除空结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25451787/