2014-05-14 1 views
1

У меня есть некоторые проблемы с выполнением метода findOne класса MongoOperations, так как теперь этот метод возвращает null. Структура моей информации в mongoDB выглядит так:Реализация findOne в Spring Data (MongoDB)

> db.news.find({_id:1}) 
{ "_id" : 1, "title" : "first title", "text" : "first text" } 
> db.news.find({_id:{$type:1}}) 
{ "_id" : 1, "title" : "first title", "text" : "first text" } 

Как вы можете видеть выше, поле _id имеет двойной тип. Мои классы Java выглядят так:

@Repository 
public class NewsService { 

    @Autowired 
    private MongoOperations mongoOperations; 

    public static final String COLLECTION_NAME = "news"; 

    //this method executes ok 
    public List<NewsEntity> getAllNews() { 
     return mongoOperations.findAll(NewsEntity.class, COLLECTION_NAME); 
    } 

    //but this method return null  
    public NewsEntity getNewsDetail(Long id) { 
     return mongoOperations.findOne(Query.query(Criteria.where("_id").is(id)), NewsEntity.class); 
    } 

Entity Класс:

@Document 
public class NewsEntity { 

@Id 
private Long id; 
private String title; 
private String text; 


public Long getId() { 
    return id; 
} 

public void setId(Long id) { 
    this.id = id; 
} 

public String getTitle() { 
    return title; 
} 

public void setTitle(String title) { 
    this.title = title; 
} 

public String getText() { 
    return text; 
} 

public void setText(String text) { 
    this.text = text; 
} 
} 

И Спринг контроллер:

@Controller 
public class MainController { 
@Autowired 
private NewsService newsService; 

@RequestMapping(value="/news/details/{newsId}",method = RequestMethod.GET) 
public String getNewsDetails(ModelMap model, @PathVariable("newsId") Long newsId) { 
    //newsEnt is null here... 
    NewsEntity newsEnt = newsService.getNewsDetail(newsId); 

    model.addAttribute("newsDet", newsEnt); 
    return "newsdetails"; 
} 
} 
+0

Нет коллекции, выбранной на вашем ['findOne()'] (http://docs.spring.io/spring-data/mongodb/docs/1.3.5.RELEASE/api/org/springframework/data/ mongodb/core/MongoOperations.html # findOne). Поскольку вы вызываете mongooperations напрямую без извлечения коллекции, вам нужно использовать этот тип подписи метода. –

+0

Привет, Нейл, для меня это совершенно непонятно. Вы имеете в виду, что я должен добавить новый метод (collectionName) в метод findOne следующим образом: T findOne (Запрос запроса, Класс entityClass, String collectionName) – Iurii

ответ

3

Вы вызываете экземпляр mongoOperations напрямую, а не первое извлечение коллекции. Так много, как findAll метода вы реализовали также необходима в форме, которая содержит коллекцию в качестве аргумента:

public NewsEntity getNewsDetail(Long id) { 
    return mongoOperations.findOne(
     Query.query(Criteria.where("_id").is(id)), 
     NewsEntity.class, 
     COLLECTION_NAME 
    ); 
} 

Это охватывается в документации findOne, а также увидеть доступные сигнатуры методы в summary.

+0

Спасибо, теперь это работает. – Iurii