Мне сложно понять, как выполнить довольно простой агрегатный запрос в репозитории Spring-Data-Couchbase. Я использую org.springframework.data.spring-data-couchbase:3.2.0.RELEASE
Допустим, у меня есть корзина с именем Organism со свойствами, такими как:
SpeciesId SpeciesName SpeciesDesc OrderId OrderDesc ClassId ClassDesc
1 Human H sapiens 21 Primates 31 Mammalia
2 Chimpanzee P troglodytes 21 Primates 31 Mammalia
3 Fruit fly D melanogaster 22 Diptera 32 Insecta
Я хочу написать запрос, который позволяет мне искать уникальные Ордена или Классы;в SQL запросы выглядят так:
SELECT OrderId, OrderDesc FROM Organism WHERE OrderDesc like 'Pri%' GROUP BY OrderId, OrderDesc
SELECT ClassId, ClassDesc FROM Organism WHERE ClassDesc like 'Mam%' GROUP BY ClassId, ClassDesc
Как бы я создал эти запросы в репозитории spring-data-couchbase?
Я пробовал около тысячи различныхвещи пока что, но ни один из них не сработал. Сначала я попытался добавить различные запросы к хранилищу:
public interface Order {
public Integer getOrderId();
public String getOrderDesc();
}
@N1qlPrimaryIndexed
@ViewIndexed(designDoc = "organism")
public interface OrganismRepository extends
CouchbasePagingAndSortingRepository<Organism, String> {
Optional<List<Order>> findDistinctByOrderDescStartingWith(String orderDesc);
}
Затем я попытался использовать аннотацию @Query:
//Exception - Unable to retrieve enough metadata for N1QL to entity mapping, have you selected _ID and _CAS?
@Query("SELECT orderDesc FROM #{#n1ql.bucket} WHERE orderDesc like 'Pri%' AND #{#n1ql.filter}")
Optional<List<String>> cantSelectPropertyBecauseMissingMetadata();
//Exception - Unable to execute query due to the following n1ql errors:
// {"msg":"Expression must be a group key or aggregate: (meta(`organism`).`id`)","code":4210}
@Query("#{#n1ql.selectEntity} where #{#n1ql.filter} AND orderDesc like 'pro%' group by orderId, orderDesc")
Optional<List<Order>> selectionsMustBeIncludedInGroupByClause();
//Exception - Unable to retrieve enough metadata for N1QL to entity mapping, have you selected _ID and _CAS?
@Query("SELECT orderId, orderDesc FROM #{#n1ql.bucket} where #{#n1ql.filter} AND orderDesc like 'Pri%' group by orderId, orderDesc")
Optional<List<Order>> cantGroupByJustTwoPropsBecauseMissingMetadata();
//Exception - Unable to retrieve enough metadata for N1QL to entity mapping, have you selected _ID and _CAS?
@Query("SELECT distinct orderDesc FROM #{#n1ql.bucket} WHERE orderDesc like 'pro%' AND #{#n1ql.filter}")
Optional<List<String>> cantSelectDistinctBecauseMissingMetadata();
//Exception - Unable to execute query due to the following n1ql errors:
// {"msg":"Expression must be a group key or aggregate: (meta(`organism`).`id`)","code":4210}
@Query("SELECT orderId, orderDesc, META(#{#n1ql.bucket}).id as _ID, META(#{#n1ql.bucket}).cas as _CAS FROM #{#n1ql.bucket} where #{#n1ql.filter} AND orderDesc like 'Pri%' group by orderId, orderDesc")
Optional<List<Order>> cantGroupByJustTwoPropsBecauseStillMissingMetadata();
//Exception - Unable to execute query due to the following n1ql errors:
// {"msg":"Expression must be a group key or aggregate: (meta(`organism`).`id`)","code":4210}
@Query("SELECT orderId, orderDesc, META(#{#n1ql.bucket}).id as _ID, META(#{#n1ql.bucket}).cas as _CAS FROM #{#n1ql.bucket} where #{#n1ql.filter} AND orderDesc like 'Pri%' group by orderId, orderDesc, _ID, _CAS")
Optional<List<Order>> cantGroupByMETA();
@Query("SELECT distinct orderDesc, META(#{#n1ql.bucket}).id as _ID, META(#{#n1ql.bucket}).cas as _CAS FROM #{#n1ql.bucket} WHERE orderDesc like 'Pri%' AND #{#n1ql.filter}")
Optional<List<Order>> resultsAreNotDistinct();
@Query("SELECT distinct orderId, orderDesc, META(#{#n1ql.bucket}).id as _ID, META(#{#n1ql.bucket}).cas as _CAS FROM #{#n1ql.bucket} WHERE orderDesc like 'Pri%' AND #{#n1ql.filter}")
Optional<List<Order>> resultsAreNotDistinct2();
@Query("SELECT orderId, orderDesc, META(#{#n1ql.bucket}).id as _ID, META(#{#n1ql.bucket}).cas as _CAS FROM #{#n1ql.bucket} where #{#n1ql.filter} AND orderDesc like 'Pri%' group by orderId, orderDesc, META(#{#n1ql.bucket}).id, META(#{#n1ql.bucket}).cas")
Optional<List<Order>> resultsAreNotDistinct3();
Единственный способ, которым мы смогли получитьЭта функциональность для работы до сих пор с com.couchbase.client.java.Bucket
из com.couchbase.client.java-client:2.7.9
. Но я был бы шокирован, если бы не было способа сделать это в Spring-Data-Couchbase ...
String queryString = "SELECT distinct orderId, orderDesc " +
"FROM `organisms` " +
"WHERE orderDesc LIKE $search"
Cluster cluster = CouchbaseCluster.create(hosts).authenticate(bucketUser, bucketPassword);
Bucket bucket = cluster.openBucket(bucketName);
JsonObject parameters = JsonObject.create().put("search", search);
ParameterizedN1qlQuery q = N1qlQuery.parameterized(queryString, parameters);
N1qlQueryResult result = bucket.query(q);