考虑拥有合同,修订,维护,经销商等的汽车... 当合同中有更新时,将找到一个 revision_id 和一个 revision_timestemp ,如果您使用contract_aud,则可以通过reivsion_id找到新版本。
我的目标是向最终用户提供一个查询,让他可以问:在startDate和endDate之间有哪些汽车(复数)进行了修订。请注意,修订可以在合同/维护/经销商等中进行……(而且我只关心汽车的ID)
根据我今天的情况,可以按以下方式按日期查询:
AuditReader auditReader = AuditReaderFactory.get(em);
AuditQuery q = auditReader.createQuery().forRevisionsOfEntity(Car.class, false, true);
q.add(AuditEntity.revisionProperty("timestamp").ge(startDate.getTime()));
q.add(AuditEntity.revisionProperty("timestamp").lt(endDate.getTime()));
但是您可以注意到,我发送了 Car.class ,如果修订是在“ 合同”中进行的,则我必须发送Contract.class(并且稍后获得汽车的ID)
我有20多个带有后缀_AUD的表,因此去数据库20次是没有意义的。
问题:如何查询日期与修订号和已更改的对象之间的修订。
答案 0 :(得分:1)
您可以尝试在修订版本实体中使用III
批注。
此link有一些详细信息(未编入索引,搜索注释,您将找到它。)
使用注释并不是那么简单,因为注释会更改您正在使用的修订实体(即使它是提供的默认实体或任何自定义的实体)。
它将创建与每个修订版本关联的集合,并且在此集合中将包含在相关修订版本中更改的实体名称。
有了它,您可以在给定的时间窗口中查询修订,以及已更改的表。稍后,您可以使用修订时间戳记来更改事务中的每个实体。
如果您仍在开发中,那肯定会有所帮助,但是,如果您有生产运行中的系统,则仅对将来的更改有用。
答案 1 :(得分:0)
一种经典方法是使用左连接编写一个简单的SQL语句,该语句为每个表提供日期和修订。目的仅是接收CAR ID,而不提供任何版本说明。
SELECT ri.revision_id, ri.revision_timestamp, s.id supplier_id ...
from revinfo as ri
left join ...
left join...
where ri.revision_timestamp
between 1546530449341 and 1546532280293
奥卡姆剃须刀;-)