【问题标题】:Add OR condition to query添加 OR 条件进行查询
【发布时间】:2014-10-30 10:16:34
【问题描述】:

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

    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();
    }

【问题讨论】:

    标签: hibernate-envers nhibernate-envers


    【解决方案1】:

    使用AuditEntity.Disjunction()

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

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

    【讨论】:

      【解决方案2】:

      我在Java 中确实像上面提到的 @Roger 一样。 (以防万一有人需要)

      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;
      }
      

      【讨论】:

        猜你喜欢
        • 2021-01-17
        • 1970-01-01
        • 1970-01-01
        • 2016-09-22
        • 2020-11-15
        • 1970-01-01
        • 2011-03-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多