Получить строку sql из Couchbase N1qlQuery DSL? - PullRequest
1 голос
/ 06 августа 2020

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

1 Ответ

1 голос
/ 06 августа 2020

A Statement можно преобразовать в String, просто вызвав 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);

OUTPUT:

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);

OUTPUT (предварительно определено):

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

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

...