2013-06-11 9 views
11

Próbuję zaimplementować zapytanie niestandardową według Reference 4.4 niestandardowych zastosowań:sprężynowy danych MongoDB zwyczaj realizacja PropertyReferenceException

http://static.springsource.org/spring-data/data-mongodb/docs/current/reference/html/repositories.html

What's the difference between Spring Data's MongoTemplate and MongoRepository?

Robię to, bo muszę specjalny zapytania za pomocą mongoTemplate.

Błąd, który dostaję, to wyjątek PropertyReferenceException. Wydaje się więc, że dane źródłowe próbują automatycznie wygenerować zapytanie, którego nie chcę. Chcę użyć własnego zapytania niestandardowego.

org.springframework.data.mapping.PropertyReferenceException: No property search found for type com.eerra.core.common.dto.User 

Problem opisany jest również tutaj, ale rozwiązanie nie wydaje się działać dla mnie:

http://forum.springsource.org/showthread.php?114454-Custom-repository-functionality

Pytanie

Jak mogę realizować moje niestandardowy interfejs zapytań i implementacja bez danych sprężynowych próbujących automatycznie wygenerować zapytanie?

konfiguracji

Wiosna konfiguracji

sprężyny data.xml

<!-- Spring Data MongoDB repository support --> 
<mongo:repositories base-package="com.eerra.*.common.service" /> 

repozytorium klas i interfejsy są usytuowane w następujących opakowaniu:

com.eerra.core.common.service.UserRepositoryInterface.java com.eerra.core.common.service.UserRepoistoryCustom.java (interfejs) com.eerra.core.common.service.UserRepositoryCustomImpl.java (realizacja)

UserRepositoryCustom.java

public interface UserRepositoryCustom { 
    List<User> searchAllUsers(); 
} 

UserRepositoryCustomImpl.java

public class UserRepositoryCustomImpl implements UserRepositoryCustom { 

    @Autowired 
    private MongoTemplate mongoTemplate; 

    @Override 
    public List<User> searchAllUsers() { 
     return mongoTemplate.findAll(User.class); 
    } 
} 

UserRepositoryInterface.java

@Repository 
public interface UserRepositoryInterface extends MongoRepository<User, String>, UserRepositoryCustom { 
    User findByEmail(String email); 
    List<User> findByEmailLike(String email); 
    List<User> findByEmailOrLastName(String email, String lastName); 
    List<User> findByEmailOrFirstNameLike(String email, String firstName); 

    @Query("{\"$or\" : [ { \"email\" : { \"$regex\" : ?0, \"$options\" : \"i\"}} , " + 
     "{ \"firstName\" : { \"$regex\" : ?0, \"$options\" : \"i\"}}, " + 
     "{ \"lastName\" : { \"$regex\" : ?0, \"$options\" : \"i\"}}]}") 
    List<User> findByEmailOrFirstNameOrLastNameLike(String searchText); 
} 

Odpowiedz

24

Problem ten został rozwiązany. Ten błąd pojawia się, gdy klasa Impl ma niepoprawną nazwę. Klasa Impl musi być nazwana zgodnie z klasą repozytorium. Więc nazwy muszą być po za tym przykładzie:

  • com.eerra.core.common.service.UserRepositoryInterface.java (główne repozytorium)
  • com.eerra.core.common.service.UserRepositoryInterfaceImpl.Java (wdrażanie metod niestandardowych repozytorium)
  • com.eerra.core.common.service.UserRepositoryInterfaceCustom.java (interfejs z metod niestandardowych)

Patrz odpowiedź tutaj: What's the difference between Spring Data's MongoTemplate and MongoRepository?