问题描述
这是我的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 ;我假设参数匹配,但返回上述错误。 怎么了?任何帮助,将不胜感激 埃内斯托(Ernesto)
解决方法
好,我对自己说... 首先:对查询(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 -> {
......
......
}
一切正常