Criteria cats = sess.createCriteria(Cat.class).add( Restrictions.like("name", "jerry");
Criteria kittens = cats.createCriteria("kittens");
List catList = cats.list();
上图中,只有带有相关小猫的猫才会被包含在结果中。满足这个名字的猫=杰里'如果他们的小猫'小猫将不包含在结果中。外键为null。这看起来很奇怪,因为我没有对小猫进行任何限制。我有两个问题:为什么会出现这种情况?什么是避免这种行为的理想方法,并且无论他们是否有小猫,都会让猫返回(是createAlias)吗?
出现这个问题的原因是,使用条件,我可能想做类似以下的事情:
if (someCondition) kittens.add(restriction);
因此,建立小猫'从实际的角度来看,提前的标准是有道理的,尽管它没有按照我的意图运作。
答案 0 :(得分:0)
对于HQL和Criteria,无论何时指定隐式连接,Hibernate都会假设您想要一个INNER JOIN。 INNER JOIN正在过滤掉空值。
您需要使用左连接,从Cat到小猫。
criteria.addAlias("kittens","kitten", CriteriaSpecification.LEFT_JOIN);