JPA称存储过程从2 db中选择数据

时间:2015-09-18 18:24:24

标签: java mysql sql hibernate jpa

我正在使用mySql和jee应用程序使用jpa和hibernate

我有一个存储过程,它从db1中的表中删除数据,然后从db2中选择表中的数据并将它们从db1中插入表中

CREATE PROCEDURE `update_data`(myId int(11))
BEGIN
    DELETE FROM db1.tbl1
    WHERE db1.tbl1.id = myId;

    INSERT INTO
    db1.tbl1
    SELECT * FROM
    db2.tbl1
    WHERE db2.tbl1.id = myId;
END

在sql中调用时成功 从jpa调用时,它返回异常

ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (default task-17) ResultSet is from UPDATE. No Data.
ERROR [stderr] (default task-17) org.hibernate.exception.GenericJDBCException: could not execute query

JAVA代码:

@PersistenceContext(name = "db2", unitName = "db2")
EntityManager em;

org.hibernate.Session session = (org.hibernate.Session) em.getDelegate();

        Transaction tx = null;
        tx = session.beginTransaction();
        try {
            Query query = session
                    .createSQLQuery("CALL update_teachers(:sesId)")
                    .addEntity(Teacher.class).setParameter("sesId", sesId);
            query.list();
            session.flush();
            session.clear();

            tx.commit();
        } catch (HibernateException e) {
            if (tx != null)
                tx.rollback();
            e.printStackTrace();
        } finally {
        session.close();
        }

问题似乎是来自2个不同数据库的选择,其中em无法处理此操作 我该如何执行此任务

注意:我也试过native named query 我试过@NamedStoredProcedureQuery 所有人都给出了同样的例外

2 个答案:

答案 0 :(得分:2)

您似乎执行存储过程并期望返回结果集:

plotLines: [
    {
        color: 'red',
        dashStyle: 'shortdash',
        value: response.AverageTime,
        width: 2,
        label: {
            text: response.PlotLineName, 
            x: +10, 
            y: +30,
            rotation: 360,
            color: 'red'
        }
    }
]

这对我来说似乎不对,你不会得到任何记录。尝试调用它,就像要运行更新或删除一样:

query.list();

答案 1 :(得分:0)

正如Sva.Mu已经写过的那样,存储过程调用会引发异常,因为实体管理器期望调用的结果,如果你使用

query.list();

您可以在错误消息的这一部分中看到它

ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (default task-17) ResultSet is from UPDATE. No Data.

如果您使用

,则呼叫应该有效
query.executeUpdate()

在这种情况下,实体管理器不会期望存储过程调用的任何结果。

如果你使用@NamedStoredProcedureQuery或更动态的StoredProcedureQuery,这是一样的。您可以在我这里了解更多相关信息:@NamedStoredProcedureQueryStoredProcedureQuery

相关问题