【问题标题】:How to update 2 tables using one query in JPA native query?如何在 JPA 原生查询中使用一个查询更新 2 个表?
【发布时间】:2015-01-09 10:04:02
【问题描述】:

我有 2 个表 TABLE1 和 TABLE2。Table1 有名称,Table2 有电子邮件和电话。

要获取姓名、邮箱和电话,我查询如下

 query = entityManagerUtil.createNativeQuery("select s.Name,c.Phone1,c.Email1 from Table1 s,Table2 c where c.id= s.NodeID and s.NodeID =21")

现在我的下一个要求是更新姓名、电子邮件和电话。由于这些参数存在于不同的表中,所以我正在搜索将更新 2 个表的单个查询。不幸的是,我正在使用 sql server 并且有 no way to update 2 tables using single query

所以我正在考虑使用@Transactional 和 2 个查询来更新 2 个表,如下所示

@Transactional
public void updateDetails()
{
Query query1=   entityManagerUtil.entityManager.createNativeQuery("update Table1 set  Name='' where id in (select NodeID from Table 2) and NodeID=21");
Query query2=   entityManagerUtil.entityManager.createNativeQuery("update Table2 set  Email='' and phone1='' where NodeID in (select id from Table 2) and NodeID=21");
query1.executeUpdate();
query2.executeUpdate();

}

还有其他更好的方法来更新 2 个表吗?

【问题讨论】:

  • 你不能用一条 SQL 语句在一个查询中更新 2 个表,所以你不能在 Hibernate 中这样做。要么改变你的架构,要么你的事务方法是要走的路。
  • @mavroprovato 您指的是什么架构更改?我使用的方式(@Transactional)是否有效?
  • 我的意思是将两列放在同一个表中。至于 Transactional 注释,它看起来不错,但如果没有看到更多代码,我不能肯定地告诉你:它只能在 spring bean 中工作,你必须进行一些配置等。你必须阅读并明白这一点:docs.spring.io/spring/docs/current/spring-framework-reference/…

标签: java spring hibernate jpa


【解决方案1】:

你可以使用 JDBCTemplate

http://sujitpal.blogspot.com.es/2007/03/spring-jdbctemplate-and-transactions.html

它允许使用一个连接执行多个查询,因此您可以节省一些时间而不是执行两次。

【讨论】:

    【解决方案2】:

    您为什么不为此使用 Hibernate 实体。只需加载与 Table1 和 table2 关联的实体,修改它们并让automatic dirty checking 机制代表您更新表。顺便说一句,这就是使用 ORM 的原因之一。

    【讨论】:

    • 感谢您的回答,我阅读了您的博客,但我不知道如何编写代码。如果您能举个例子就好了
    • 首先,阅读整个 Hibernate 文档。其次,在了解了基础知识之后,尝试一个例子。如果您仍有问题,请针对实际代码尝试提出另一个 SO 问题
    • 我没有表的实体,为此我使用本机查询。原因是桌面应用程序是内置在 .net 中的 Windows 应用程序,因此他们使用的是 sql server。我给他们一个ios应用程序使用他们现有的数据库,所以我不能使用模型类或实体。希望你理解
    • 然后,您需要添加实体。一点都不复杂。
    • 希望你明白我为什么没有实体以及为什么我使用原生查询
    猜你喜欢
    • 2016-10-02
    • 1970-01-01
    • 2011-05-19
    • 2015-05-09
    • 1970-01-01
    • 2018-11-13
    • 1970-01-01
    • 2011-08-31
    • 1970-01-01
    相关资源
    最近更新 更多