Spring -data mongodb пользовательская реализация PropertyReferenceException
Я пытаюсь реализовать пользовательский запрос в соответствии с пользовательскими реализациями Reference 4.4:
http://static.springsource.org/spring-data/data-mongodb/docs/current/reference/html/repositories.html
В чем разница между Spring Data MongoTemplate и MongoRepository?
Я делаю это, потому что мне нужны специальные запросы, используя mongoTemplate.
Я получаю ошибку PropertyReferenceException. Похоже, что spring -data пытается автогенерировать запрос, который я не хочу. Я хочу использовать свой собственный пользовательский запрос.
org.springframework.data.mapping.PropertyReferenceException: No property search found for type com.eerra.core.common.dto.User
Проблема также описывается здесь, но решение, похоже, не работает для меня:
http://forum.springsource.org/showthread.php?114454-Custom-repository-functionality
Вопрос
Как я могу реализовать свой пользовательский интерфейс и реализацию запроса без spring -data, пытаясь автоматически генерировать запрос?
Конфигурация
Spring Конфигурация
spring -data.xml
<!-- Spring Data MongoDB repository support -->
<mongo:repositories base-package="com.eerra.*.common.service" />
Классы и интерфейсы репозитория расположены в следующем пакете:
com.eerra.core.common.service.UserRepositoryInterface.java
com.eerra.core.common.service.UserRepoistoryCustom.java(интерфейс)
com.eerra.core.common.service.UserRepositoryCustomImpl.java(реализация)
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);
}
Ответы
Ответ 1
Проблема решена. Эта ошибка появляется, когда класс Impl назван неправильно. Класс Impl должен быть назван в соответствии с классом репозитория. Поэтому для этого примера должны быть имена:
- com.eerra.core.common.service.UserRepositoryInterface.java(основной репозиторий)
- com.eerra.core.common.service.UserRepositoryInterfaceImpl.java(реализация пользовательских методов репозитория)
- com.eerra.core.common.service.UserRepositoryInterfaceCustom.java(интерфейс с пользовательскими методами)
См. ответ здесь:
В чем разница между Spring Data MongoTemplate и MongoRepository?