JaVers - получить изменения аудита по составному ключу - PullRequest
0 голосов
/ 03 марта 2020

У меня есть тестовый пример, который пытается запросить изменения дочерней сущности по ее 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 голосов
/ 03 марта 2020

Это явно показано в javado c

    /**
     * Query for selecting Changes, Snapshots or Shadows for a given Entity instance.
     * 

* * For example, last Changes on "bob" Person: * * javers.findChanges( QueryBuilder.byInstanceId("bob", Person.class).build() ); *
* * @param localId Значение свойства Id. Если у сущности есть Composite-Id (более одного Id-свойства) - * localId должно быть Map&lt;String, Object&gt; с * Id-свойством name для пар значений. * @see CompositeIdExample. groovy * / publi c stati c QueryBuilder byInstanceId (Object localId, Class entityClass) {Validate.argumentsAreNotNull (localId, entityClass); вернуть новый QueryBuilder (новый IdFilterDefinition (instanceId (localId, entityClass))); }

попробуйте сначала прочитать javado c, прежде чем спрашивать квестинов о методе

0 голосов
/ 03 марта 2020

Это сработало после передачи instanceId как map:

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

...