2014-09-15 6 views
5

У меня есть способ получить категорию по ее «id», и мне нужен аналогичный метод, чтобы получить категорию по ее «имени». Я использовал эти методы, используя Hibernate. Как я могу исправить свой второй метод, чтобы получить категорию по имени? Мой исходный код выглядит следующим образом:Hibernate SQLQuery - получить объект по имени

// It works 
@Override 
public Category getById(int id) { 
    return (Category) sessionFactory.getCurrentSession().get(Category.class, id); 
} 

// It doesn't works 
@Override 
public Category getByName(String name) { 
    return (Category) sessionFactory.getCurrentSession(). 
     createSQLQuery("SELECT FROM Category WHERE name="+name); 
} 

У меня есть эта ошибка со вторым способом:

java.lang.ClassCastException: org.hibernate.impl.SQLQueryImpl не может ввергнуть к ком. sedae.model.Category

Это мои контроллеры.

@RequestMapping(value = "/getCategoryById/{id}") 
public String getCategoryById(Model model, @PathVariable ("id") int id){ 
    model.addAttribute("category", categoryService.getById(id)); 
    return "/getCategoryById"; 
} 

@RequestMapping(value = "/getCategoryByName/{name}") 
public String getCategoryByName(Model model, @PathVariable("name") String name){ 
    model.addAttribute("category", categoryService.getByName(name)); 
    return "/getCategoryByName"; 
} 

Спасибо заранее.

ответ

4

Если вы уверены, что у вас есть только одна запись на категории имя в вашей таблице, то вы можете использовать Query#uniqueResult:

Query query= sessionFactory.getCurrentSession(). 
     createQuery("from Category where name=:name"); 
query.setParameter("name", name); 
Category category = (Category) query.uniqueResult(); 

Убедитесь обрабатывать исключения, брошенные uniqueResult.

+0

Спасибо, чувак! Еще один вопрос. Предположим, у меня есть две категории (с разными идентификаторами, очевидно). Как я могу получить определенную категорию, избегая ошибки «запрос не возвратил уникальный результат: 2». ? – wilson

+0

В этом случае запрос возвращает список, вы можете перебирать список и получать желаемый объект, или если вы хотите, чтобы какой-либо из объектов имел одинаковое имя категории, вы можете использовать 'query.setMaxResults (1);', this возвращает первую найденную категорию с указанным именем категории. – user3487063

+0

@wilson, было ли решение для вас? – user3487063

Смежные вопросы