Java 语句中的Couchbase参数化N1QL查询
使用Java 语句中的Couchbase参数化N1QL查询,java,couchbase,n1ql,Java,Couchbase,N1ql,使用com.couchbase.client,java客户端version2.2.7我无法使n1ql查询工作,该查询使用带有多个项的IN语句。请参见下面的示例查询和java代码 public int getCountForDuration(Long startTime, Long endTime, String ids){ JsonObject placeHolders = JsonObject.create().put("ids", ids).put("startTime", star
com.couchbase.client,java客户端
version2.2.7
我无法使n1ql查询工作,该查询使用带有多个项的IN语句。请参见下面的示例查询和java代码
public int getCountForDuration(Long startTime, Long endTime, String ids){
JsonObject placeHolders = JsonObject.create().put("ids", ids).put("startTime", startTime).put("endTime", endTime);
N1qlQuery query = N1qlQuery.parameterized(COUNT_STATEMENT, placeHolders)
N1qlQueryResult result = bucket.query(query);
...
}
public static final String COUNT_STATEMENT = "select count(*) as count " +
"from bucketName " +
"where docType = 'docId' " +
"and (id IN [$ids]) " + <----- OFFENDING LINE
"and publishTimestamp between $startTime and $endTime";
当有多个ID时,所有这些都不起作用,但是如果只有一个ID,如ids=“'123'”
则可以正常工作。如果我在终端上使用CBQ,我的查询也可以工作
我的问题是如何包装一个参数化的N1QL查询
可以在in语句中接受多个项吗
删除语句中
$id
周围的括号,并将实际id作为JsonArray
对象放入占位符中,应该可以:
JsonObject placeHolders = JsonObject.create()
.put("ids", JsonArray.from("id1", "id2", "id3"))
.put("startTime", startTime)
.put("endTime", endTime);
删除语句中$id
周围的括号,并将实际id作为JsonArray
对象放入占位符中,应该可以:
JsonObject placeHolders = JsonObject.create()
.put("ids", JsonArray.from("id1", "id2", "id3"))
.put("startTime", startTime)
.put("endTime", endTime);
放错括号的应该是“and(id IN([$id])”,放错括号的应该是“and(id IN([$id])”),“嘿,Simon,你能在这里看一下这个问题吗couchbase CollectionInfo日志,提前谢谢。我如何在Spring数据中设置这样的占位符?例如,我有:@Query(“{n1ql.selectEntity}使用键$ids”)集合findByIdIn(@Param(“ids”)列表id)
但是通过Http调用它,我得到了“JsonArray不支持的类型:class java.util.ArrayList”
唯一能让它工作的方法是:@Query(“{n1ql.selectEntity}USE KEYS$ids”)集合findByIdIn(@Param(“ids”)JsonArray ids)然后定义自定义objectMapper,从rest调用获取JsonArray。有更好的方法吗?我的意思是使用@repositoryrestresource如果你只是简单地使用KEYS,那么你最好使用crudepository的findAll(Iterable)
方法我使用的查询只是为了举例。一般来说,我可以使用自定义查询,其中需要将来自@RepositoryRestResource
中http调用的Iterable
映射到查询参数。因此,目前我看不到任何方法可以让它工作(其他人使用自定义objectMapper)。嘿,Simon,你能在这里查看一下couchbase collectInfo日志吗?提前谢谢。我如何在Spring数据中设置这样的占位符?例如,我有:@Query(“{n1ql.selectEntity}使用键$ids”)集合findByIdIn(@Param(“ids”)列表id)
但是通过Http调用它,我得到了“JsonArray不支持的类型:class java.util.ArrayList”
唯一能让它工作的方法是:@Query(“{n1ql.selectEntity}USE KEYS$ids”)集合findByIdIn(@Param(“ids”)JsonArray ids)然后定义自定义objectMapper,从rest调用获取JsonArray。有更好的方法吗?我的意思是使用@repositoryrestresource如果你只是简单地使用KEYS,那么你最好使用crudepository的findAll(Iterable)
方法我使用的查询只是为了举例。一般来说,我可以使用自定义查询,其中需要将来自@RepositoryRestResource
中http调用的Iterable
映射到查询参数。因此,目前我认为没有办法让它工作(其他人使用自定义objectMapper)。