2014-09-15 2 views
5

J'ai une méthode pour obtenir une catégorie par son "id" et j'ai besoin d'une méthode similaire pour obtenir une catégorie par son "nom". J'ai fait ces méthodes en utilisant Hibernate. Comment puis-je corriger ma seconde méthode pour obtenir une catégorie par nom? Mon code source est la suivante:Hibernate SQLQuery - Obtenir l'objet par son nom

// 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); 
} 

J'ai cette erreur avec la deuxième méthode:

java.lang.ClassCastException: org.hibernate.impl.SQLQueryImpl ne peut pas être jeté à com. sedae.model.Category

Ce sont mes contrôleurs.

@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"; 
} 

Merci d'avance les gens.

Répondre

4

Si vous êtes sûr que vous avez une seule entrée par nom de la catégorie dans votre tableau, vous pouvez utiliser Query#uniqueResult:

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

Assurez-vous de gérer les exceptions lancées par uniqueResult.

+0

Merci mec! Une question de plus s'il vous plaît. Supposons que j'ai deux catégories (avec des identifiants différents, évidemment) Comment puis-je obtenir une catégorie spécifique en évitant l'erreur "requête n'a pas retourné un résultat unique: 2". ? – wilson

+0

Dans ce cas, la requête renvoie une liste, vous pouvez itérer sur la liste et obtenir l'objet que vous voulez ou si vous voulez un de l'objet avec le même nom de catégorie, alors vous pouvez utiliser 'query.setMaxResults (1); renvoie la première catégorie rencontrée avec le nom de catégorie spécifié. – user3487063

+0

@wilson, est-ce que la solution a fonctionné pour vous? – user3487063