首页 > 解决方案 > 从 Couchbase N1qlQuery DSL 获取字符串 sql?

问题描述

在此堆栈溢出答案couchbase java n1ql 查询文档中的示例中构建查询对象后,我们可以在将字符串查询发送到服务器之前获取它吗?我不想将它发送到服务器。只是想用 DSL 构建它,然后获取带有参数的完整查询的字符串,将发送到服务器的内容,并以另一种方式处理它。

标签: couchbasequerydslcouchbase-java-api

解决方案


AStatement可以通过调用转换为字符串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"
}

如果您需要内联参数,那么您需要自己做这部分,要格外小心正确地转义字符串参数。


推荐阅读