2014-09-15 30 views
5

Tôi có một phương thức để lấy Danh mục theo "id" của nó và tôi cần một phương thức tương tự để lấy Danh mục theo "tên" của nó. Tôi đã làm những phương pháp này bằng cách sử dụng Hibernate. Làm thế nào tôi có thể sửa chữa phương pháp thứ hai của tôi để có được một thể loại theo tên? mã nguồn của tôi là như sau:Hibernate SQLQuery - Nhận đối tượng theo tên

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

Tôi có lỗi này với phương pháp thứ hai:

java.lang.ClassCastException: org.hibernate.impl.SQLQueryImpl không thể được đúc để com. sedae.model.Category

Đây là bộ điều khiển của tôi.

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

Cảm ơn trước mọi người.

Trả lời

4

Nếu bạn chắc chắn bạn chỉ có một entry cho mỗi tên category trong bảng của bạn sau đó bạn có thể sử dụng Query#uniqueResult:

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

Hãy chắc chắn để xử lý các trường hợp ngoại lệ ném bởi uniqueResult.

+0

Cảm ơn anh bạn! Một câu hỏi xin vui lòng. Giả sử tôi có hai loại (với các id khác nhau, rõ ràng) Làm thế nào tôi có thể có được một thể loại cụ thể bằng cách tránh lỗi "truy vấn không trả về một kết quả duy nhất: 2". ? – wilson

+0

Trong trường hợp đó truy vấn trả về một danh sách, bạn có thể lặp qua danh sách và lấy đối tượng bạn muốn hoặc nếu bạn muốn bất kỳ một đối tượng nào có cùng tên danh mục thì bạn có thể sử dụng 'query.setMaxResults (1);', this trả về danh mục gặp phải đầu tiên với tên danh mục được chỉ định. – user3487063

+0

@wilson, giải pháp có hiệu quả với bạn không? – user3487063

Các vấn đề liên quan