【发布时间】:2013-06-06 18:57:25
【问题描述】:
我正在尝试根据参考 4.4 自定义实现来实现自定义查询:
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 尝试自动生成查询的情况下实现我的自定义查询接口和实现?
配置
弹簧配置
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(接口) 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);
}
【问题讨论】:
-
对于未来的读者,如果您在 JSON 查询中使用单引号,则不必转义字符:
{ 'email': ?0 }而不是{ \"email\": ?0 }
标签: spring spring-data spring-data-mongodb