【问题标题】:query in hibernate with annotations带注释的休眠查询
【发布时间】:2013-11-27 18:45:44
【问题描述】:

当我尝试使用休眠完成选择时,抛出此异常:

org.hibernate.hql.internal.ast.QuerySyntaxException: formato is not mapped [from formato]
    at org.hibernate.hql.internal.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:180)
    at org.hibernate.hql.internal.ast.tree.FromElementFactory.addFromElement(FromElementFactory.java:110)
    at org.hibernate.hql.internal.ast.tree.FromClause.addFromElement(FromClause.java:93)
    at org.hibernate.hql.internal.ast.HqlSqlWalker.createFromElement(HqlSqlWalker.java:324)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElement(HqlSqlBaseWalker.java:3420)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElementList(HqlSqlBaseWalker.java:3309)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromClause(HqlSqlBaseWalker.java:706)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:562)

我检查了我的对象注释并认为没问题,这是代码:

@Entity
@Table(name="formato")
public class Formato implements Serializable{

    /**
     * 
     */
    private static final long serialVersionUID = 5849413670083213438L;
    @Id
    @Column(name="id")
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int id;
    @Column(name="formato")
    private String formato;
    @Column(name="tipoItem")
    private int tipoItem;

在 BD 中,属性具有相同的名称

显然放置了 getter 和 setter,以及我的 DAO:

@Transactional
    public List<Formato> findAllFormatos() {
        Transaction tx = null;
        session = sessionFactory.getCurrentSession();
        try {
            tx = session.beginTransaction();
            List formatos = session.createQuery("from formato").list();
            System.out.println("Pase :'D");
            tx.commit();
            return formatos;

        } catch (Exception e) {
            // TODO: handle exception
            if (tx != null) tx.rollback();
            e.printStackTrace();
            return null;
        }


    }

最后是控制器,但我认为问题出在 DAO 中

@RequestMapping(value = "timbre", method = RequestMethod.GET)
    public String redirigir(@RequestParam("id") int id, Model model) {

        Timbre t = null;
        if (id == 1){
            t = new Timbre();
            model.addAttribute("t", t);

            List<Formato> formatos= timbreDAO.findAllFormatos();
            model.addAttribute("formatos", formatos);


            return "formTimbre";

        }   
        else if (id == 2)
            return "modificarTimbre";
        else if (id == 3)
            return "eliminarTimbre";
        else if (id == 4)
            return "buscarTimbre";
        else
            return "timbre";

    }

【问题讨论】:

    标签: mysql spring hibernate taglib hibernate-annotations


    【解决方案1】:

    在HQL中,你应该使用映射@Entity的java类名和属性名,而不是实际的表名和列名,所以HQL应该是:

    List<Formato> formatos = (List<Formato>)session.createQuery("from Formato").list();
    

    【讨论】:

      【解决方案2】:

      如果您没有在 SessionFactory 中声明带注释的实体,则会出现该异常。 如果您使用的是 spring,那么在 sessionFactory Bean 中指定以下内容。它也可能是 .cfg 文件。

      <property name="annotatedClasses">
               <list>
       <value>com.somefolder.Formato</value>
      </list>
      </property>
      

      【讨论】:

      • 是的,在 HQL 中也必须是“来自 Formato f”
      • 是的,你是对的,但我发现我没有写每个对象更好的解决方案:com.mufi.objeto array> 但现在抛出此异常:在 ServletContext 资源 [/WEB-INF/servlet-context.xml] 中定义名称为“mySessionFactory”的 bean 创建错误:调用 init 方法失败;嵌套异常是 org.hibernate.MappingException: persistent class not known: int
      • 您可能必须在映射文件中使用 Integer 代替 int
      • 还可以查看所有有映射的文件,如果注释配置不正确,就会发生这种情况。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-05
      相关资源
      最近更新 更多