在 Mysql 上使用 EntityManager JPA 运行脚本

Posted

技术标签:

【中文标题】在 Mysql 上使用 EntityManager JPA 运行脚本【英文标题】:Run script with EntityManager JPA on Mysql 【发布时间】:2013-05-30 01:28:54 【问题描述】:

我正在尝试运行一个脚本(.sql 文件),但由于我尝试了很多方法,我遇到了多个错误,这是我的主要 sql 脚本:

INSERT INTO `Unity` VALUES (11,'paq',0,'2013-04-15 11:41:37','Admin','Paquete','Paq',0,'2013-04-15 11:41:37','AAA010101AAA',NULL);
INSERT INTO `product` VALUES (11,'chi','USD','chi one',0,'2013-04-15 11:42:13',0,'Admin','Chi name',0.25,0,15,'2013-04-15 11:42:13','AAA010101AAA',NULL);

这是我的主要 dao 代码:

@Autowired
private EntityManager em;
@Override
public Integer runSql(String path) 
    try 
        Archivo archivo = new Archivo();
        String strQuery = archivo.readFileText(path);
        Query query = em.createNativeQuery(strQuery);
        return query.executeUpdate();
     catch (IOException e) 
        e.printStackTrace();
        return 0; //TODO return false;
    

如果我只用一个插入运行脚本,它运行正常,但是当我的脚本有超过 1 个插入时,我得到以下异常:

您的 SQL 语法有错误;检查手册 对应于您的 mysql 服务器版本,以便使用正确的语法 靠近'INSERT INTO producto_servicio VALUES (11,'chi','USD','chi 一个',0,'2013-04-15 11:42:13',0,'' 在第 2 行

有没有办法运行包含多个插入的脚本文件?

我也尝试过 BEGIN、END、START TRANSACTION AND COMMIT,但没有好的结果。

感谢您的帮助:)

【问题讨论】:

我不认为你可以用 entityManager 做到这一点,你需要直接使用 JDBC api。类似的问题 - ***.com/questions/6734423/…. 【参考方案1】:

据我所知,您无法通过em.createNativeQuery 执行脚本。 您应该将脚本拆分为语句并一一执行。

您可以使用ScriptRunner。它可以与 MyBatis 分开使用。

例子:

em.getTransaction().begin();
Connection connection = em.unwrap(Connection.class);
ScriptRunner sr = new ScriptRunner(connection);
sr.runScript(new StringReader("INSERT INTO `Unity` VALUES (11,'paq',0,'2013-04-15 11:41:37','Admin','Paquete','Paq',0,'2013-04-15 11:41:37','AAA010101AAA',NULL);\r\nINSERT INTO `product` VALUES (11,'chi','USD','chi one',0,'2013-04-15 11:42:13',0,'Admin','Chi name',0.25,0,15,'2013-04-15 11:42:13','AAA010101AAA',NULL);"));
em.getTransaction().commit();

【讨论】:

谢谢...到目前为止,我所做的是阅读每一行并单独执行,每个脚本不应超过 5 个查询,所以现在我采取这个解决方案,稍后再检查 myBatis一,谢谢 可以用这个运行 JPQL 脚本吗?还是 scriptRunner 总是只有原生 sql?

以上是关于在 Mysql 上使用 EntityManager JPA 运行脚本的主要内容,如果未能解决你的问题,请参考以下文章

如何使用休眠将mysql与Java连接?例外:没有名为 org.hibernate.tutorial_jpa 的 EntityManager 的持久性提供程序 [关闭]

使用 EntityManager 在实体上设置悲观锁定

在 Spring 上实例化 EntityManager

从 EntityManager 获取所有映射的实体

不允许在共享 EntityManager 上创建事务 - 使用 Spring 事务或 EJB CMT

EntityManager 刷新