簡體   English   中英

REST API:將參數傳遞給 Vertx pgclient 中的preparedQuery

[英]REST API: pass parameters to preparedQuery in Vertx pgclient

這是來自我的 API 的響應:

"The number of parameters to execute should be consistent with the expected number of parameters = [2] but the actual number is [0]."

我使用 pgClient、Vert.x 3.9.3 並使用各種 REST API 沒有問題,但是....在這個查詢中(可能是錯誤的)

private static final String SELECT_CBA = "select art.leyenda, $1::numeric(10,3) as cantidad, uni.abreviatura, \r"
+ "round(((art.precio_costo * (art.utilidad_fraccionado/100)) + art.precio_costo) * $2::numeric(10,3),2) as totpagar \r"
+ "FROM public.articulos art join public.unidades uni on uni.idunidad = art.idunidad \r"
+ "WHERE (substring(art.codigobarra,1,2) = \'$3\' and substring(art.codigobarra,3,6) = \'$4\')";

一些解釋
$1 和 $2 是相同的參數; $2 和 $3 必須是帶引號的參數。 這是我的休息垂直:

poolClient = PgPool.pool(vertx, options, poolOptions);      
bizArticulo = new BizArticulo(poolClient);
Router router = Router.router(vertx);
router.route("/api/articulos*").handler(BodyHandler.create());
router.get("/api/articulos").handler(bizArticulo::getAll);
router.get("/api/articulos/:cantcomp1/:cantcomp2/:tipoprod/:prodpadre").handler(bizArticulo::getOneReadingBarcode);

其中 :cantcomp1 -> $1, :cantcomp2 -> $2, :tipoprod -> $3 和 $4 -> :prodpadre

最后,這是我的“生意”

public void getOneReadingBarcode(RoutingContext routingContext) {       
        HttpServerResponse response = routingContext.response();
        pgClient
        .preparedQuery(SELECT_CBA)      
        .execute(ar -> {
            if (ar.succeeded()) {
                RowSet<Row> rows = ar.result();
                List<Articulo> articulos = new ArrayList<>();
                rows.forEach(row -> {
                    articulos.add(fromBarCode(row));
                });
                response.putHeader("content-type", "application/json; charset=utf-8")
                .setStatusCode(200)
                .end(Json.encodePrettily(articulos));
            } else {
                System.out.println("Failure: " + ar.cause().getMessage());
                response.putHeader("content-type", "application/json; charset=utf-8")
                .end(Json.encodePrettily(ar.cause().getMessage()));
            }
        });
    }

在郵遞員中,我寫道:

192.168.0.15:8092/api/articulos/ 0.750 / 0.750 / 20/021162; 我假設參數匹配,但它返回上面提到的錯誤。 怎么了? 任何幫助將不勝感激埃內斯托

好的,我對自己回答......首先:對我的查詢(SELECT_CB)的小修正,我將參數 $1, $2... 放在括號中..

private static final String SELECT_CBA = "select art.leyenda, ($1::numeric(10,3)) as cantidad, uni.abreviatura, \r"
+ "round(((art.precio_costo * (art.utilidad_fraccionado/100)) + art.precio_costo) * ($2::numeric(10,3)),2) as totpagar \r"
+ "FROM public.articulos art join public.unidades uni on uni.idunidad = art.idunidad \r"
+ "WHERE (substring(art.codigobarra,1,2) = ($3) and substring(art.codigobarra,3,6) = ($4))";

第二:從上下文中獲取參數(請參閱上一個問題中的router.context

Double cantComprada1 = Double.parseDouble(routingContext.request().getParam("cantcomp1"));
Double cantComprada2 = Double.parseDouble(routingContext.request().getParam("cantcomp2"));
String tipoProducto = routingContext.request().getParam("tipoprod");
String productoPadre = routingContext.request().getParam("prodpadre");

第三:將參數作為參數

pgClient
.preparedQuery(SELECT_CBA)
.execute(Tuple.of(cantComprada1, cantComprada2, tipoProducto, productoPadre), ar -> {
......
......
}

一切正常

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM