diff --git a/src/integration/java/org/springframework/data/couchbase/repository/ReactiveN1qlCouchbaseRepositoryTests.java b/src/integration/java/org/springframework/data/couchbase/repository/ReactiveN1qlCouchbaseRepositoryTests.java index 0cb02214..05459472 100644 --- a/src/integration/java/org/springframework/data/couchbase/repository/ReactiveN1qlCouchbaseRepositoryTests.java +++ b/src/integration/java/org/springframework/data/couchbase/repository/ReactiveN1qlCouchbaseRepositoryTests.java @@ -111,4 +111,16 @@ public class ReactiveN1qlCouchbaseRepositoryTests { } assertNotNull("Expected to find several parties", previousDesc); } + + @Test + public void testCustomSpelCountQuery() { + long count = partyRepository.countCustom().block(); + assertEquals("Test N1QL Spel based query", 15, count); + } + + @Test + public void testPartTreeQuery() { + long count = partyRepository.countAllByDescriptionNotNull().block(); + assertEquals("Test N1QL part tree based query", 15, count); + } } diff --git a/src/integration/java/org/springframework/data/couchbase/repository/ReactivePartyRepository.java b/src/integration/java/org/springframework/data/couchbase/repository/ReactivePartyRepository.java index a1be5f7d..4a560506 100644 --- a/src/integration/java/org/springframework/data/couchbase/repository/ReactivePartyRepository.java +++ b/src/integration/java/org/springframework/data/couchbase/repository/ReactivePartyRepository.java @@ -37,7 +37,7 @@ public interface ReactivePartyRepository extends ReactiveCouchbaseRepository countCustomPlusFive(); - @Query("#{#n1ql.selectEntity} WHERE #{#n1ql.filter}") + @Query("SELECT count(*) FROM #{#n1ql.bucket} WHERE #{#n1ql.filter}") Mono countCustom(); @Query("SELECT 1 = 1") diff --git a/src/main/java/org/springframework/data/couchbase/repository/query/ReactiveAbstractN1qlBasedQuery.java b/src/main/java/org/springframework/data/couchbase/repository/query/ReactiveAbstractN1qlBasedQuery.java index 9f230f75..fd4429fc 100644 --- a/src/main/java/org/springframework/data/couchbase/repository/query/ReactiveAbstractN1qlBasedQuery.java +++ b/src/main/java/org/springframework/data/couchbase/repository/query/ReactiveAbstractN1qlBasedQuery.java @@ -16,13 +16,12 @@ package org.springframework.data.couchbase.repository.query; import java.util.Map; -import java.util.Optional; - import com.couchbase.client.java.document.json.JsonValue; import com.couchbase.client.java.query.N1qlQuery; import com.couchbase.client.java.query.Statement; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.data.couchbase.core.CouchbaseQueryExecutionException; import org.springframework.data.couchbase.core.RxJavaCouchbaseOperations; import org.springframework.data.couchbase.repository.query.support.N1qlUtils; import org.springframework.data.repository.query.*; @@ -80,7 +79,7 @@ public abstract class ReactiveAbstractN1qlBasedQuery implements RepositoryQuery if (queryMethod.isQueryForEntity()) { return execute(query, typeToRead); } else { - return executeSingleProjection(query); + return executeSingleProjection(query, typeToRead); } } @@ -95,9 +94,17 @@ public abstract class ReactiveAbstractN1qlBasedQuery implements RepositoryQuery return couchbaseOperations.findByN1QL(query, typeToRead); } - protected Object executeSingleProjection(N1qlQuery query) { + protected Object executeSingleProjection(N1qlQuery query, final Class typeToRead) { logIfNecessary(query); - return couchbaseOperations.findByN1QLProjection(query, Map.class); + return couchbaseOperations.findByN1QLProjection(query, Map.class) + .map(m -> { + if (m.size() > 1) { + throw new CouchbaseQueryExecutionException("Query returning primitive got more values than expected: " + + m.size()); + } + Object v = m.values().iterator().next(); + return this.couchbaseOperations.getConverter().getConversionService().convert(v, typeToRead); + }); } @Override