2016-05-04 4 views
0

У меня естьSpring Data MongoRepositories DtoInstantiatingConverter

@Document 
public class Employee 
{ 
@Id 
Long empCode; 
String empSurname; 
String address; 
// getters setters 
} 

Я написал запрос, используя Монго Хранилища как

public interface EmployeeRepository extends MongoRepository<Employee, Long> 
{ 

List<Employee> findEmployeesByEmpCode(int empCode); 

@Query(value="{ 'empCode' : ?0 }", fields="{ 'address' : 1}") 
List<String> findAddressByEmpCode(int empCode); 

Первые работы запроса, но второй не удается. Он работает только в том случае, если я изменяю возвращаемый тип List to Employee.

Ошибка при выходе из строя является

java.lang.IllegalArgumentException: [Assertion failed] - this argument is required; it must not be null 
    at org.springframework.util.Assert.notNull(Assert.java:115) 
    at org.springframework.util.Assert.notNull(Assert.java:126) 
    at org.springframework.data.convert.EntityInstantiators.getInstantiatorFor(EntityInstantiators.java:86) 
    at org.springframework.data.mongodb.repository.query.DtoInstantiatingConverter.<init>(DtoInstantiatingConverter.java:61) 
    at org.springframework.data.mongodb.repository.query.MongoQueryExecution$ResultProcessingConverter.convert(MongoQueryExecution.java:376) 
    at org.springframework.data.mongodb.repository.query.MongoQueryExecution$ResultProcessingExecution.execute(MongoQueryExecution.java:345) 
    at org.springframework.data.mongodb.repository.query.AbstractMongoQuery.execute(AbstractMongoQuery.java:91) 

Очевидно, что он не может работать, как преобразовать значения из содержащегося в ней объекта Employee к String. Как это реализовать? Любой пример будет высоко оценен.

Спасибо,

ответ

1

Атрибут fields используется для фильтрации свойства, которые не установлены в вашей предметной области (Employee). Это не имеет ничего общего с механизмом проекции MongoDB.

Чтобы использовать проекцию здесь, см. projections in the reference documentation.

Вы должны создать интерфейс проекции:

interface AddressesProjection { String getAddress(); }

и изменить хранилище сигнатуру метода соответственно:

List<AddressesProjection> findByEmpCode(int empCode);

Проекции декларировать контракт между подстилающей тип и сигнатуры метода, связанные с выставленным имуществом х годов. Следовательно, требуется указать методы getter в соответствии с именем свойства базового типа.

Это ближайший вы можете найти, afaik.

+0

Большое спасибо @Ori. Это именно то, что требовалось. – Macky

+0

Кажется, я не могу вернуть список из проекции. Это просто дает мне первый соответствующий элемент. Если я запустил запрос в консоли, я получу список значений. Проекция подобна этой @Value ("# {target.address}") public List getStringValue(); – Macky

+0

@John. Не совсем понял, что вы комментируете. Вы все еще сталкиваетесь с проблемами? Кроме того, поскольку вы запрашиваете свойство '@ Id' (' empCode'), ожидается один результат. –