2016-05-04 1 views
0

J'aiprintemps données MongoRepositories DtoInstantiatingConverter

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

J'ai écrit une requête en utilisant comme Mongo Référentiels

public interface EmployeeRepository extends MongoRepository<Employee, Long> 
{ 

List<Employee> findEmployeesByEmpCode(int empCode); 

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

Les premiers travaux de la requête, mais la seconde échoue. Cela ne fonctionne que si je change le type de liste renvoyé à Employé.

L'erreur à l'échec est

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) 

De toute évidence, il ne peut pas fonctionner comment convertir les valeurs du contenu objet employé à cordes. Comment puis-je implémenter ceci? Tout exemple serait très apprécié.

Merci,

Répondre

1

L'attribut fields est utilisé pour filtrer les propriétés qui ne sont pas définies dans vos objets de domaine (Employee). Il n'a pas grand chose à voir avec le mécanisme de projection MongoDB.

Pour utiliser la projection ici, voir projections in the reference documentation.

Vous devez créer une interface de projection:

interface AddressesProjection { String getAddress(); }

et changer la signature de méthode référentiel en conséquence:

List<AddressesProjection> findByEmpCode(int empCode);

Les projections déclarent un contrat entre le sous-jacent type et les signatures de méthode liées à la propriété exposée sies Il est donc nécessaire de nommer les méthodes getter en fonction du nom de la propriété du type sous-jacent.

Ceci est le plus proche que vous pouvez obtenir, afaik.

+0

Merci beaucoup @Ori. C'est exactement ce qui était requis. – Macky

+0

Je n'arrive pas à renvoyer une liste de la projection. Cela me donne juste le premier élément correspondant. Si j'exécute la requête dans la console, je récupère une liste de valeurs. La projection est similaire à @Value ("# {target.address}") public Liste getStringValue(); – Macky

+0

@John. Je n'ai pas vraiment compris votre commentaire. Êtes-vous toujours confronté à des problèmes? De plus, comme vous interrogez la propriété '@ Id' (' empCode'), un seul résultat est attendu. –