Hibernate session.createQuery(来自TableProcess).list();不起作用

时间:2013-07-10 14:44:07

标签: java sql spring hibernate spring-mvc

我最近一直在与Netbeans和MySQL合作创建一个Spring + Hibernate应用程序,但我在代码块中遇到了一些问题:

public List listSystemProcess() {
        List procesosSistema = null;
        String hbQuery = "from TableProcess";

        try {
            Session hbSesion = HibernatePersistenceHandler.getSessionFactory().openSession();
            Transaction tx = hbSesion.beginTransaction();
            Query query = hbSesion.createQuery(hbQuery);
            procesosSistema = query.list();
            tx.commit();
            hbSesion.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return procesosSistema;
    }

这根本不起作用,我得到一些与SQL语法异常相关的东西,告诉我“从tb_2_1中选择id2_1,uj8_,5sd_11”附近有语法错误......“

如果我创建一个SQLQuery而不是一个HQL,它可以很好地工作,但是我觉得这样做没有用,因为我应该为每个进程执行此操作,这很乏味,而且几乎与使用JDBC相同。

这有效:

String hbQuery = "select p.id,p.nombre,p.descripcion,p.frecuencia_uso,t.nombre "
        + "from tb_proceso_sistema p inner join tb_tipo_proceso t "
        + "on p.tb_tipo_proceso_id = t.id";
    Query query = hbSesion.createSQLQuery(hbQuery);

但是当我这样做的时候,我的jsp也有所改变:

<c:forEach items="${procesosSistema}" var="proceso">
                <tr onmouseover="this.style.backgroundColor='#ffff66';"
            onmouseout="this.style.backgroundColor='#d4e3e5';">
                    <td><c:out value="${proceso[0]}"/></td>
                    <td><c:out value="${proceso[1]}"/></td>
                    <td><c:out value="${proceso[2]}"/></td>
                    <td><c:out value="${proceso[3]}"/></td>
                    <td><c:out value="${proceso[4]}"/></td>
                    <td></td>
                </tr>
            </c:forEach>

而不是:

<c:forEach items="${procesosSistema}" var="proceso">
                <tr onmouseover="this.style.backgroundColor='#ffff66';"
            onmouseout="this.style.backgroundColor='#d4e3e5';">
                    <td><c:out value="${proceso.id}"/></td>
                    <td><c:out value="${proceso.nombre}"/></td>
                    <td><c:out value="${proceso.descripcion}"/></td>
                     ...
                    <td></td>
                </tr>
            </c:forEach>

当我在属性“show_sql”中设置时,它会显示一个奇怪的查询,如上所示:

"select id2_1,uj8_,5sd_11 from SGDP-mysql123.tb_2_1.... tb0"

如果有人能帮助我,我会非常感激。

提前致谢。

3 个答案:

答案 0 :(得分:1)

我在这里有疑问,你提到了

String hbQuery =“from TableProcess”;

你的“TableProcess”类是否在hbm.xml文件中有一个映射表?

如果您在第二个查询中使用内连接,那么就不能有这样的映射,您只能像这样使用它。

答案 1 :(得分:1)

如果“TableProcess”类在hbm.xml中有映射并且在数据库中存在表,请尝试以下代码:

public List listSystemProcess() {
    List<TableProcess> procesosSistema = null;
    String hbQuery = "SELECT p FROM TableProcess p";

    Session hbSesion = null;
    try {
        Session hbSesion =HibernatePersistenceHandler.getSessionFactory().openSession();
        Query query = hbSesion.createQuery(hbQuery);
        procesosSistema = query.list();

    } catch (Exception e) {
        e.printStackTrace(System.err);
    } finaly{
        hbSesion.close();
    }

    return procesosSistema;
}

答案 2 :(得分:0)

嗨大家回答这个问题,但是这不是代码的问题,而是表和列的名称,因为大多数都包含字符“”,当Hibernate生成查询时,它使用“”作为其“编码”或其“查询过程”的字符。我的意思是,其中一个列被称为process_id和frequence_number,但由于该字符未被接纳,我需要用processId和frequenceNumber替换它(我不知道为什么,可能是因为Hibernate将其视为其编码的一部分或类似的东西)。正如我所提到的,我需要做的是修复表和列的名称以避免使用“_”,在解决此问题后,我需要重新生成所有数据库映射的内容并更改新的名称。然后它很好地工作,希望这个问题可以帮助有同样问题的人。

感谢大家的回答,我确实尝试过,也许他们会在类似的场景中发挥作用。