命名查询应能正常工作。您并不是在明确地说您只需要文档的一部分,所以查询返回整个文档。要实现这一点, 您不能使用命名查询
(请参阅@alexefimov答案,以在@Query
批注的帮助下使用命名查询),但可以使用
MongoTemplate旁边的
MongoRepository。为此,您必须进行一些更改:
首先,您的存储库应如下所示:
public interface HotelRepository extends MongoRepository<Hotel, String>, MongoTemplateRepository { // You can continue to write your named queries here. Spring will create that.}MongoTemplateRepository:
public interface MongoTemplateRepository { // You will write your queries which will use mongoTemplate here. List<Hotel> findByReviewsUserName(String userName);}为了实现
MongoTemplateRepository方法,您将编写一个新类。 这里重要 的是,您应该将此类命名为 存储库类名称+
Impl 。否则,spring-
data找不到您的方法实现在中定义的位置
MongoTemplateRepository。因此,您的实现类的名称应为
HotelRepositoryImpl
public class HotelRepositoryImpl implements MongoTemplateRepository { @Autowired private MongoTemplate mongoTemplate; // we will use this to query mongoDb @Override public List<Hotel> findByReviewsUserName(String userName) { Query query = new Query(); query.addCriteria(Criteria.where("reviews.username").is(userName)); query.fields().include("reviews.$"); return mongoTemplate.find(query, Hotel.class); }}用法:
hotelRepository.findByReviewsUserName("userName");正如你可以看到我们可以代码
.include()或
.exclude用于查询的字段。当您只想包含数组字段的匹配部分时,我们将
$运算符与数组字段名称一起使用。
结论: 您仍然可以使用受Spring数据良好支持的命名查询,此外,如果您需要对子文档进行 聚合
或某些复杂的查询,而这些子查询无法通过spring生成命名查询,则可以在新创建的mongoTemplate存储库类中进行。您可以从访问所有存储库方法
HotelRepository。



