添加OR条件进行查询

时间:2014-10-30 10:16:34

标签: hibernate-envers nhibernate-envers

我想知道如何在Envers标准api中添加OR条件:

    public IEnumerable<Guid> GetHistory(object id, params string[] props)
    {
        var auditQuery = AuditReaderFactory.Get(Session).CreateQuery()
            .ForRevisionsOfEntity(typeof(T), false, true);

        foreach (var prop in props)
        {
            auditQuery.Add(AuditEntity.RelatedId(prop).Eq(id)); // <-- adds AND, while OR is required!
        }

        return auditQuery
            .GetResultList<object[]>()
            .Select(i => ((T)i[0]).ID)
            .Distinct();
    }

2 个答案:

答案 0 :(得分:4)

使用AuditEntity.Disjunction()

在您的示例中,类似于......

[..]
var disjunction = AuditEntity.Disjunction();
foreach (var prop in props)
{
  disjunction.Add(AuditEntity.RelatedId(prop).Eq(id)); 
}
auditQuery.Add(disjunction);
[..]

答案 1 :(得分:2)

我在上面提到的 @Roger Java中确实喜欢这个。 (以防万一有需要)

public List<Employee> getAuditHistory(Session session, int id, String property) {
    AuditReader auditReader = AuditReaderFactory.get(session);
    List<Employee> employeeHistory = new ArrayList<>();
    if (auditReader != null) {
        AuditQuery auditQuery = auditReader.createQuery().forRevisionsOfEntity(Employee.class, true, false)
                .add(AuditEntity.property(ResultsConstants.Employee_ID).eq(id));
        AuditDisjunction auditDisjunction = null;
        if (property.equalsIgnoreCase("FULL_NAME")) {
            auditDisjunction = AuditEntity.disjunction().add(AuditEntity.property("FIRST_NAME".toUpperCase()).hasChanged())
                    .add(AuditEntity.property("LAST_NAME".toUpperCase()).hasChanged());
        } else {
            auditQuery = auditQuery.add(AuditEntity.property(property.toUpperCase()).hasChanged());
        }
        auditQuery = auditQuery.addOrder(AuditEntity.property("MODIFIED_DATE").desc());
        if(null != auditDisjunction){
            auditQuery = auditQuery.add(auditDisjunction);
        }
        if (auditQuery != null) {
            if (auditQuery.getResultList().isEmpty()) {
                // Log here or throw it back to caller
            }
            employeeHistory.addAll(auditQuery.getResultList());
        }
    }
    return employeeHistory;
}