Получить String sql из Couchbase N1qlQuery DSL?

После создания объекта запроса, как в этом ответе на переполнение стека или примерах в couchbase java n1ql query docs можем ли мы получить строковый запрос перед отправкой на сервер? Я не хочу отправлять его на сервер. Просто хочу собрать его с DSL, потом получить строку полного запроса с параметрами на месте, что бы ушло на сервер, и обработать его другим способом.


person tgkprog    schedule 05.08.2020    source источник


Ответы (1)


Statement можно преобразовать в строку, просто вызвав toString():

import com.couchbase.client.java.document.json.JsonObject;
import com.couchbase.client.java.query.N1qlQuery;
import com.couchbase.client.java.query.Statement;

import static com.couchbase.client.java.query.Select.select;
import static com.couchbase.client.java.query.dsl.Expression.i;
import static com.couchbase.client.java.query.dsl.Expression.path;
import static com.couchbase.client.java.query.dsl.Expression.s;
import static com.couchbase.client.java.query.dsl.Expression.x;

Statement statement = select(path(i("travel-sample"), "*"))
    .from(i("travel-sample"))
    .where(x("name").eq(x("$airline_param"))
        .and(x("type").eq(s("airline"))));

System.out.println(statement);

ВЫХОД:

SELECT `travel-sample`.* FROM `travel-sample` WHERE name = $airline_param AND type = "airline"

Как видите, это не приводит к замене параметров. Аргументы отправляются на сервер отдельно от инструкции. Если вы хотите увидеть, что отправляется на сервер, вы можете вызвать N1qlQuery.n1ql():

JsonObject args = JsonObject.create().put("$airline_param", "FooFliers");
N1qlQuery q = N1qlQuery.parameterized(statement, args);

JsonObject statementAndArgs = q.n1ql(); 
System.out.println(statementAndArgs);

ВЫВОД (предварительно):

{
  "statement": "SELECT `travel-sample`.* FROM `travel-sample` WHERE name = $airline_param AND type = \"airline\"",
  "$airline_param": "FooFliers"
}

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

person dnault    schedule 06.08.2020
comment
спасибо любезно. Можете ли вы дать мне импорт для этого? Если он где-то сохранен... Я работаю над частью заявления, но не смог получить его из функций? - person tgkprog; 07.08.2020
comment
вопрос (или предложение, если его еще нет) " title="couchbase n1qlquery dsl пустое, но умное выражение для инициализации с помощью when"> stackoverflow.com/questions/63319538/ - person tgkprog; 10.08.2020