Hibernate 多对多上的休眠条件内部联接始终为空
我使用Hibernate 3.2.1.GA,在条件和ContextParameterValue之间有一个多对多映射。当我创建一个条件查询并将条件和ContextParameterValue与一个内部连接一起连接时,条件上的ContextParameterValue集合保持为空。当我将其更改为LEFT_JOIN时,ContextParameterValue集合如预期的那样有3个元素,因为查询的JOIN表中有3条相关记录 相关部分的条件和上下文参数值: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
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();