【问题标题】:How to execute DELETE and SELECT statements as one query with JPA?如何使用 JPA 将 DELETE 和 SELECT 语句作为一个查询执行?
【发布时间】:2019-08-01 13:44:40
【问题描述】:

我想在执行 DELETE 语句之前获取 SELECT 语句结果,但是它们都使用在开始时创建的同一个临时表,我不能使用 query.getResultList()query .executeUpdate() 同时进行。有没有其他办法?

CREATE TEMPORARY TABLE xyzToDelete SELECT xyz FROM ...
----
SELECT * FROM xyzToDelete
----
DELETE FROM <using xyzToDelete>
private String deleteXYZ;
----
<here I put sql file content into this string>
----
Query query = em.createNativeQuery(deleteXYZ);
query.executeUpdate();

【问题讨论】:

  • “如何使用 JPA 将 DELETE 和 SELECT 语句作为一个查询执行?” 不可能的简短回答,DELETESELECT 在 MySQL 中遵循不同的代码路径,即你能做的最好的就是开始TRANSACTION
  • 你想要什么是可能的,它被称为“SQL 注入”,我 100% 同意 @Raymond Nijland 的评论
  • "我想在执行 DELETE 语句之前得到 SELECT 语句结果" 那么先在代码中执行SELECT 然后DELETE java 代码将“阻塞”(主/当前线程)并首先等待结果。 ...
  • “你想要什么是可能的,它被称为“SQL 注入”,” 不知道你为什么在这里提到“SQL 注入”@EduardoEljaiek 但确实你必须处理createNativeQuery(..)使用时要小心..
  • 也许如果您分享最终目标是什么,我们可以提供更多帮助。您是说要重新使用 select 语句来驱动删除请求吗?或者一般来说,您是否尝试共享/重用临时表?

标签: java mysql sql jpa


【解决方案1】:

酸的问题。如果未完成,事务将回滚。 您应该将 SELECT & DELETE 拆分为两个事务。

你最好的选择是:

Query query = em.createNativeQuery(CREATE TABLE xyzToDelete SELECT xyz FROM SELECT * FROM xyzToDelete);
List<String> results = query.getResultlist();
Query query2 = em.createNativeQuery(DELETE FROM xyzToDelete);
List<String> changes = query.executeUpdate();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-07
    • 2022-01-19
    • 1970-01-01
    • 2017-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多