代码之家  ›  专栏  ›  技术社区  ›  Jono

这个简单的HQL语法有什么问题?

  •  2
  • Jono  · 技术社区  · 14 年前

    嗨,我正在尝试执行这个简单的HQL查询,以便使用以下命令从我的数据库中获取文件列表:

    private static final String SQL_GET_FILE_LIST = "select filename, size, id, type from fileobject";
    
    @Override
    public List<FileObject> getFileList(String type) {
        // TODO Auto-generated method stub
        List<FileObject> files = hbTemplate.find(SQL_GET_FILE_LIST);
        hbTemplate.flush();
        return files;
    }
    

    但我一直有个例外:

      org.hibernate.hql.ast.QuerySyntaxException: fileobject is not mapped [select filename, size, id, type from fileobject]
        org.hibernate.hql.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:158)
        org.hibernate.hql.ast.tree.FromElementFactory.addFromElement(FromElementFactory.java:87)
        org.hibernate.hql.ast.tree.FromClause.addFromElement(FromClause.java:70)
        org.hibernate.hql.ast.HqlSqlWalker.createFromElement(HqlSqlWalker.java:257)
        org.hibernate.hql.antlr.HqlSqlBaseWalker.fromElement(HqlSqlBaseWalker.java:3056)
        org.hibernate.hql.antlr.HqlSqlBaseWalker.fromElementList(HqlSqlBaseWalker.java:2945)
        org.hibernate.hql.antlr.HqlSqlBaseWalker.fromClause(HqlSqlBaseWalker.java:688)
        org.hibernate.hql.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:544)
        org.hibernate.hql.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:281)
        org.hibernate.hql.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:229)
        org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:228)
        org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:160)
        org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:111)
        org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:77)
        org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:56)
        org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:72)
        org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:133)
        org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:112)
        org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1623)
        org.springframework.orm.hibernate3.HibernateTemplate$30.doInHibernate(HibernateTemplate.java:923)
        org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:419)
        org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)
        org.springframework.orm.hibernate3.HibernateTemplate.find(HibernateTemplate.java:921)
        org.springframework.orm.hibernate3.HibernateTemplate.find(HibernateTemplate.java:913)
        com.kc.models.DbFileHelper.getFileList(DbFileHelper.java:65)
        com.kc.models.FileHelper.getFileList(FileHelper.java:108)
        com.kc.Controllers.AppListController.getFileList(AppListController.java:63)
        com.kc.Controllers.AppListController.handleRequest(AppListController.java:34)
        org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:48)
        org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:875)
        org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:807)
        org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:571)
        org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:501)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    

    我的hbm.xml文件文件

    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
            "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
            "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    
    <hibernate-mapping package="com.kc.models.FileObject" >
    
        <class name="com.kc.models.FileObject" table="fileobject">
            <id name="id" column="ID">
                <generator class="native" />
            </id>
            <property name="filename" type="string" column="FILENAME" />
            <property name="type" type="string" column="TYPE" />
            <property name="size" type="double" column="SIZE" />
            <property name="file" type="blob" length="1000000000" column="FILE" />
        </class> 
    
    </hibernate-mapping> 
    
    2 回复  |  直到 14 年前
        1
  •  7
  •   Pascal Thivent    14 年前

    fileobject is not mapped 但是 FileObject

    select filename, size, id, type from FileObject
    

    第二,因为你使用的是投影,所以你不会得到一个 List<FileObject> List<Object[]> . 所以你的代码应该是:

    private static final String SQL_GET_FILE_LIST = "select filename, size, id, type from FileObject";
    
    @Override
    public List<Object[]> getFileList(String type) {
        // TODO Auto-generated method stub
        List<Object[]> files = hbTemplate.find(SQL_GET_FILE_LIST);
        hbTemplate.flush();
        return files;
    }
    

    或者,如果希望获得类型安全的结果,可以使用构造函数表达式(假设类提供了适当的构造函数):

    select new FileObject(filename, size, id, type) from FileObject
    

    然后你就可以用你现在的代码了。

    private static final String SQL_GET_FILE_LIST = "select new FileObject(filename, size, id, type) from FileObject";
    
    @Override
    public List<FileObject> getFileList(String type) {
        // TODO Auto-generated method stub
        List<FileObject> files = hbTemplate.find(SQL_GET_FILE_LIST);
        hbTemplate.flush();
        return files;
    }
    

    参考

        2
  •  3
  •   Jon Skeet    14 年前

    您指定的是表名,而不是类名;它们的大小写不同。试试这个:

    private static final String SQL_GET_FILE_LIST = 
         "select filename, size, id, type from FileObject";
    

    诚然,我已经有一段时间没有冬眠了,但是我 犯罪嫌疑人