фильтр запросов Dynamodb с необязательным параметром - PullRequest
0 голосов
/ 26 ноября 2018

В приведенном ниже коде условие языкового фильтра является необязательным, может ли оно содержать данные или иметь значение NULL.Если он содержит нуль, означает, что DynamodB выдает ошибкуКак это преодолеть?

Карта expressionAttributesNames = new HashMap <> ();expressionAttributesNames.put ("# Language", "Language");

    Map<String,AttributeValue> expressionAttributeValues = new HashMap<>();
    //expressionAttributeValues.put(":docType", new AttributeValue().withS("cp"));
    expressionAttributeValues.put(":docName", new AttributeValue().withS("data part"));
    //expressionAttributeValues.put(":docKey", new AttributeValue().withS("xxx yyy"));
    expressionAttributeValues.put(":language", new AttributeValue().withS(null));

    DynamoDBQueryExpression<Tools> queryExpression = new DynamoDBQueryExpression<PuToolsbtools>()
            .withKeyConditionExpression(keyConditionExpression)
            .withExpressionAttributeNames(expressionAttributesNames)
            .withExpressionAttributeValues(expressionAttributeValues)
            .withFilterExpression("#Language = :language"); List<Toolsools> tools = mapper.query(Tools.class, queryExpression); 

Исключение составляет,

ExpressionAttributeValues ​​содержит недопустимое значение: Supplied AttributeValue пусто, должно содержать ровно один из поддерживаемых типов данныхдля ключа: язык (Сервис: AmazonDynamoDBv2; Код состояния: 400; Код ошибки: ValidationException;

1 Ответ

0 голосов
/ 26 ноября 2018

Если выражение фильтра language является необязательным, его следует включать в запрос только в том случае, если значение language не равно нулю.

.
.
.
if (language != null) {
    queryExpression.withFilterExpression("#Language = :language");
    expressionAttributeValues.put(":language", new AttributeValue().withS(language));
    expressionAttributesNames.put("#Language", "Language");
}

List<Tools> tools = mapper.query(Pubtools.class, queryExpression); 
...