Hibernate 多对多上的休眠条件内部联接始终为空

Hibernate 多对多上的休眠条件内部联接始终为空,hibernate,many-to-many,inner-join,Hibernate,Many To Many,Inner Join,我使用Hibernate 3.2.1.GA,在条件和ContextParameterValue之间有一个多对多映射。当我创建一个条件查询并将条件和ContextParameterValue与一个内部连接一起连接时,条件上的ContextParameterValue集合保持为空。当我将其更改为LEFT_JOIN时,ContextParameterValue集合如预期的那样有3个元素,因为查询的JOIN表中有3条相关记录 相关部分的条件和上下文参数值: class Condition { @I

我使用Hibernate 3.2.1.GA,在条件和ContextParameterValue之间有一个多对多映射。当我创建一个条件查询并将条件和ContextParameterValue与一个内部连接一起连接时,条件上的ContextParameterValue集合保持为空。当我将其更改为LEFT_JOIN时,ContextParameterValue集合如预期的那样有3个元素,因为查询的JOIN表中有3条相关记录

相关部分的条件和上下文参数值:

class Condition {

  @Id
  @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "CONDITION_SEQ")
  private Long conditionId;

  @ManyToMany(cascade = CascadeType.ALL)
  @JoinTable(name = "CONDITION_TO_PARAMVALUE", uniqueConstraints =      {@UniqueConstraint(columnNames = {"CONDITIONID", "CONTEXTPARAMETERVALUEID" }) } ,
                joinColumns = @JoinColumn(name = "CONDITIONID", nullable = false), inverseJoinColumns = @JoinColumn(name = "CONTEXTPARAMETERVALUEID", nullable = false))
  private Set<ContextParameterValue> comparisonValues = new HashSet<ContextParameterValue>();
}


class ContextParameterValue {

  @Id
  @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "CONTEXT_PARAMETER_VALUE_SEQ")
  private Long contextParameterValueId;

  @ManyToMany(targetEntity = Condition.class, mappedBy = "comparisonValues")
  private Set<Condition> conditions = new HashSet<Condition>();
}
内部连接comparisonValues会导致一个空集合:

联接表中存在将ContextParametersValue与条件关联的记录

另外,我可以在日志中看到正确的查询是由Hibernate生成的。当我对数据库Oracle11g运行查询时,会得到一个包含预期ContextParameterValue的结果

当我更改条件查询并将condition.comparisonValues alias的联接类型设置为LEFT_join时,我会得到ContextParameterValues:

我比较了为internal_JOIN和LEFT_JOIN contextParameterValues生成的查询,唯一的区别是,正如人们所期望的,contextParameterValues集合的内部/外部连接

而且,当我自己再次对数据库运行这两个查询时,正如预期的那样,这两个查询给出了完全相同的结果

因此,Hibernate似乎拥有创建comparisonValues集合所需的数据,与内部联接或左联接无关,但它仅在我指定左联接时才决定创建comparisonValues集合

这怎么可能?我一定是在监督什么,否则这是一个冬眠怪癖/错误

Criteria criteria = getSession().createCriteria(Rule.class, "rule");
criteria.createAlias("conditions", "condition", Criteria.LEFT_JOIN)
    .createAlias("condition.contextParameter", "contextParameter", Criteria.INNER_JOIN)
    .createAlias("condition.operator", "operator", Criteria.INNER_JOIN)
    // INNER JOINING comparisonValues below!
    .createAlias("condition.comparisonValues", "comparisonValues", Criteria.INNER_JOIN) 
    .createAlias("contextParameter.fieldDataType", "fieldDataType", Criteria.INNER_JOIN)
    .createAlias("contextParameter.contextParameterValues", "contextParameterValue", Criteria.LEFT_JOIN)
    .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
criteria.add(Restrictions.eq("rule.paymentMethod", paymentMethod));
criteria.addOrder(Order.asc("rule.name"));
return criteria.list();