我正在尝试使用N1QL查询查询一个spring数据库库。我有两个疑问:
我使用@Query注释来生成查询,代码如下所示:
@Query("#{#n1ql.selectEntity} WHERE $0 = $1 AND #{#n1ql.filter}")
public Page<GsJsonStore> matchJson(String term, String value, Pageable pageable);
//Query
Page<GsJsonStore> p = repo.matchJson("_object.details.status", "ready", pg);
此查询不返回任何结果。但是,当我在cbq中运行相同的查询(如下所示)时,我得到了所需的结果:
select * from default where _object.details.status = 'ready';
如何查看Couchbase存储库生成的查询字符串?我用的是弹簧靴。对这个用例使用@Query注释正确吗?
此外,如何在n1QL模板上执行CouchbaseOperations
查询?我知道有一个findByN1QL
方法,但是我没有找到任何关于它的好文档。谁能解释一下怎么用这个吗?
发布于 2016-03-14 13:29:07
查询看起来没问题。您确实使用Spring存储库持久化了您的GsJsonStore
实体,对吗?
为了记录框架生成和执行的所有查询(包括内联查询,比如在您的示例中),您可以在logback.xml
配置中像这样配置记录器:
<logger name="org.springframework.data.couchbase.repository.query" level="debug"/>
您将看到执行的查询与在cbq中运行的查询不一样,因为至少没有使用WHERE子句。
在CouchbaseOperations
中,有两种相对于N1QL查询的方法:
findByN1QL
:这需要查询的特定结构,以确保选择了用于纠正Spring数据注释实体反序列化所需的所有数据(这是#n1ql.selectEntity
和#n1ql.filter
SpEL的目的)。findByN1QLProjection
是更自由的形式.如果Jackson可以将提供的查询的结果反序列化到请求的类,那么它就会。因此,SELECT子句在此方法中的隐式限制要小得多。要同时使用这两种方法,您必须从SDK传入一个N1qlQuery
对象。这样的查询可以使用N1qlQuery
类的工厂方法来构造,例如:
//a version of the query that is constructed from positional parameters
N1qlQuery queryWithParameter = N1qlQuery.parameterized("SELECT name FROM `beer-sample` WHERE name LIKE $0", JsonArray.from("%dog%"));
//let Spring Data execute the query, projecting to the String class
List<String> beerNamesContainingDog = template.findByN1QLProjection(queryWithParameter, String.class);
https://stackoverflow.com/questions/35985700
复制相似问题