2016-07-20 2 views
1

Это запрос в репозитории, который отлично работает.Как получить поле из документа с помощью n1ql с помощью spring-data-couchbase

public interface PlayerRepo extends CrudRepository<Player, String>{ 

@Query("#{#n1ql.selectEntity} WHERE code = $1 and #{#n1ql.filter}") 
public List<Player> findPlayersWithCode(String code); 
} 

Я хочу получать конкретное поле из документа игрока, как это:

@Query("#{#n1ql.selectEntity.name} WHERE code = $1 and #{#n1ql.filter}") 
public List<String> findPlayerNamesWithCode(String code); 

Можно ли это сделать, я использую пружинные данные-couchbase 2.1.2

+0

Эта функция будет очень полезна, кажется, что это не возможно атм, но было бы очень приятно включить. – Abbadon

ответ

0

В настоящее время , это невозможно из хранилища. Spring Data Hopper представила функцию Projection, которая позволила бы ее реализовать, но реализация хранилища Couchbase еще не покрывает ее.

В CouchbaseTemplate есть что-то близкое, которое имеет метод findByN1QLProjection, но для этого требуется DTO, посвященный запросу. Например:

SELECT name, lastName FROM #{#n1ql.bucket} WHERE code = $1 AND #{#n1ql.filter} 

что эквивалентно (в чистом N1QL) для:

SELECT name, lastName FROM bucketThatBacksRepository WHERE code = $1 AND _class = "com.example.Person" 

потребуется следующий класс для работы с findByN1QLProjection:

public class PersonNameDTO { 
    private final String name; 
    private final String lastName; 

    //constructor and maybe getters/setters needed but omitted here 
} 

И это будет производить List<PersonNameDTO> , Обратите внимание, что это не сильно отличается от функции проецирования, о которой я говорил, за исключением того, что она предназначена для интерфейсов, а не для конкретных классов DTO.

Обратите внимание, что вы не должны использовать Spel #{#n1ql.selectEntity}, так как его назначение состоит в том, чтобы иметь большое предложение SELECT, которое охватывает все поля данного объекта (тогда как здесь вы хотите ограничить предложение SELECT).

Она охватывает также из части с правильным ведром, связанным с вашим хранилищем, но #{#n1ql.bucket} также охватывает ту часть (и эту часть только) ...

+0

По мне можно использовать Couchbase, я могу выполнять запросы, такие как select subDocumentField FROM 'my-bucket', где meta(). Id = 'my-id'. Так что весна данных couchbase не поддерживает его ... Подтверждение от более опытного пользователя было бы приятным :). – Abbadon

+0

Это будет возможно в версии, поставляемой с Spring Data Ingalls, соединитель couchbase затем поддержит прогнозы весенних данных –