JaVers-通过组合键检索审核更改

时间:2020-03-03 06:15:10

标签: javers

我有一个测试用例,试图通过其instanceId查询子实体的更改,它引发异常:

@TypeName("EntityOne")
    class EntityOne {
        @Id int id
        String name
        List<EntityTwo> entityTwos

        EntityOne(int id, String name, List<EntityTwo> entityTwos) {
            this.id = id
            this.name = name
            this.entityTwos = entityTwos
        }

    }

    @TypeName("EntityTwo")
    class EntityTwo {
        @Id int id
        String name
        @Id int entityOneId

        EntityTwo(int id, String name, entityOneId) {
            this.id = id
            this.name = name
            this.entityOneId = entityOneId
        }
    }

这些是经过审核的数据

oldOne = new EntityOne(1, "EntityOne", [new EntityTwo(1, "EntityTwo",1)])
newOne = new EntityOne(1, "EntityOne", [new EntityTwo(1, "EntityTwo",1),
                                                    new EntityTwo(2, "EntityTwoOne",1)])

这是查询引发异常

 entityTwoChanges = javers.findChanges(QueryBuilder.byInstanceId(1, EntityTwo) // Error is thrown
                .withNewObjectChanges()
                .withChildValueObjects()
                .build())

例外:

java.lang.Integer cannot be cast to java.util.Map
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.util.Map
    at org.javers.core.metamodel.type.InstanceIdFactory.dehydratedLocalId(InstanceIdFactory.java:48)
    at org.javers.core.metamodel.type.InstanceIdFactory.create(InstanceIdFactory.java:22)
    at org.javers.core.metamodel.type.EntityType.createIdFromInstanceId(EntityType.java:127)
    at org.javers.core.metamodel.object.GlobalIdFactory.createInstanceId(GlobalIdFactory.java:115)
    at org.javers.core.metamodel.object.GlobalIdFactory.createFromDto(GlobalIdFactory.java:127)
    at org.javers.repository.jql.FilterDefinition$IdFilterDefinition.compile(FilterDefinition.java:27)
    at org.javers.repository.jql.JqlQuery.compile(JqlQuery.java:120)
    at org.javers.repository.jql.QueryCompiler.compile(QueryCompiler.java:16)
    at org.javers.repository.jql.ChangesQueryRunner.queryForChanges(ChangesQueryRunner.java:20)
    at org.javers.repository.jql.QueryRunner.queryForChanges(QueryRunner.java:48)
    at org.javers.core.JaversCore.findChanges(JaversCore.java:196)
    at com.example.CaseQueryByCompositeKey.should able to query audit changes by composite key(CaseQueryByCompositeKey.groovy:60)

还有JaVers中是否可以通过复合键查询?

2 个答案:

答案 0 :(得分:0)

在将instanceId作为地图传递后有效:

entityTwoChanges = javers.findChanges(QueryBuilder.byInstanceId([id: 1, entityOneId: 1], EntityTwo)
                .withNewObjectChanges()
                .withChildValueObjects()
                .build())

答案 1 :(得分:0)

它已在javadoc中明确显示

    /**
     * Query for selecting Changes, Snapshots or Shadows for a given Entity instance.
     * <br/><br/>
     *
     * For example, last Changes on "bob" Person:
     * <pre>
     * javers.findChanges( QueryBuilder.byInstanceId("bob", Person.class).build() );
     * </pre>
     *
     * @param localId Value of an Id-property. When an Entity has Composite-Id (more than one Id-property) &mdash;
     *                <code>localId</code> should be <code>Map&lt;String, Object&gt;</code> with
     *                Id-property name to value pairs.
     * @see <a href="https://github.com/javers/javers/blob/master/javers-core/src/test/groovy/org/javers/core/examples/CompositeIdExample.groovy">CompositeIdExample.groovy</a>
     */
    public static QueryBuilder byInstanceId(Object localId, Class entityClass){
        Validate.argumentsAreNotNull(localId, entityClass);
        return new QueryBuilder(new IdFilterDefinition(instanceId(localId, entityClass)));
    }

在询问有关方法的问题之前,请先尝试阅读javadoc