spring-data mongodb自定义实现PropertyReferenceException

时间:2013-06-11 01:54:50

标签: spring spring-data spring-data-mongodb

我正在尝试根据参考4.4自定义实现实现自定义查询:

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?

我这样做是因为我需要使用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.xml中

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

Repository类和接口位于以下包中:

com.eerra.core.common.service.UserRepositoryInterface.java com.eerra.core.common.service.UserRepoistoryCustom.java(interface) com.eerra.core.common.service.UserRepositoryCustomImpl.java(implementation)

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 个答案:

答案 0 :(得分:25)

问题解决了。当Impl类命名不正确时,会出现此错误。必须根据存储库类命名Impl类。因此,这个例子必须遵循以下名称:

  • com.eerra.core.common.service.UserRepositoryInterface.java(主存储库)
  • com.eerra.core.common.service.UserRepositoryInterfaceImpl.java(自定义存储库方法的实现)
  • com.eerra.core.common.service.UserRepositoryInterfaceCustom.java(使用自定义方法的界面)

请在此处查看答案: What's the difference between Spring Data's MongoTemplate and MongoRepository?