Hibernate:获取现有的子标准

时间:2015-10-30 11:14:16

标签: java hibernate hibernate-criteria

我有这段代码:

linkedEntityVariable

它可以在sudo chmod 777 [path of file]中以相同的值运行两次。如果它发生了,我得到:

  

重复关联路径:   identityCards \ norg.hibernate.loader.criteria.CriteriaQueryTranslator.createAssociationPathCriteriaMap(CriteriaQueryTranslator.java:171)

如何获取子标准而不是第二次尝试创建它?

1 个答案:

答案 0 :(得分:0)

子标准列表存储在Criteria的私有字段中。可以使用Apache Commons Lang 3中的FieldUtils来读取它。从Subcriteria开始,可以使用getPath()读取路径。

所以我通过这段代码实现了我所需要的东西:

Disjunction d = Restrictions.disjunction();
... // d is set up here
Criteria linkedEntitySubcriteria = null;
try {
    List<CriteriaImpl.Subcriteria> subcriteriaList =
            (ArrayList) FieldUtils.readField(criteria, "subcriteriaList", true);
    for (CriteriaImpl.Subcriteria subcriteria : subcriteriaList) {
        if (subcriteria.getPath().equals(linkedEntityVariable)) {
            linkedEntitySubcriteria = subcriteria;
            break;
        }
    }
}
catch (IllegalArgumentException | IllegalAccessException e) {
    System.out.println("Can't get subcriteria");
}
if (linkedEntitySubcriteria == null) {
    linkedEntitySubcriteria = criteria.createCriteria(linkedEntityVariable);
}
linkedEntitySubcriteria.add(d);