пользовательская реализация spring-data mongodb PropertyReferenceException

Я пытаюсь реализовать собственный запрос в соответствии со справочником 4.4 Пользовательские реализации:

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

В чем разница между MongoTemplate Spring Data и 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);
}

person Christopher Armstrong    schedule 11.06.2013    source источник
comment
Для будущих читателей: если вы используете одинарную кавычку в запросе JSON, вам не нужно экранировать символы: { 'email': ?0 } вместо { \"email\": ?0 }   -  person redent84    schedule 07.07.2018


Ответы (1)


Проблема решена. Эта ошибка появляется, когда класс Impl назван неправильно. Класс Impl должен быть назван в соответствии с классом репозитория. Таким образом, имена должны быть следующими для этого примера:

  • com.eerra.core.common.service.UserRepositoryInterface.java (основной репозиторий)
  • com.eerra.core.common.service.UserRepositoryInterfaceImpl.java (реализация пользовательских методов репозитория)
  • com.eerra.core.common.service.UserRepositoryInterfaceCustom.java (интерфейс с пользовательскими методами)

См. ответ здесь: В чем разница между MongoTemplate Spring Data и MongoRepository?

person Christopher Armstrong    schedule 13.06.2013