【问题标题】:Hibernate SQLQuery - Get Object by nameHibernate SQLQuery - 按名称获取对象
【发布时间】:2014-11-09 11:12:38
【问题描述】:

我有一个通过“id”获取类别的方法,我需要一个类似的方法来通过“名称”获取类别。我通过使用 Hibernate 完成了这些方法。如何修复我的第二种方法以按名称获取类别? 我的源代码如下:

// 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 不能 被强制转换为 com.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";
}

提前谢谢大家。

【问题讨论】:

    标签: java spring hibernate sessionfactory


    【解决方案1】:

    如果您确定表中每个类别名称只有一个条目,那么您可以使用Query#uniqueResult

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

    确保处理由 uniqueResult 引发的异常。

    【讨论】:

    • 谢谢老兄!请再问一个问题。假设我有两个类别(显然具有不同的 id)如何通过避免错误“查询未返回唯一结果:2”来获得特定类别。 ?
    • 在这种情况下查询返回一个列表,您可以遍历列表并获取您想要的对象,或者如果您想要任何一个具有相同类别名称的对象,那么您可以使用query.setMaxResults(1);,这将返回第一个遇到的具有指定类别名称的类别。
    • 嗨@user3487063,谢谢你的回答,我已经改变了我的方法,现在它有两个参数“id”和“name”,当我需要按名称列出我的查询时选择按id和name分门别类,重名没有问题。谢谢老兄的提问。
    猜你喜欢
    • 2014-01-16
    • 2023-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-03
    • 1970-01-01
    相关资源
    最近更新 更多