【问题标题】:Check if rows exist in table检查表中是否存在行
【发布时间】:2015-11-16 03:27:28
【问题描述】:

考虑一下这段代码。如果未找到该行,则此代码将其插入数据库,然后仅在找到该行时更新它。 updateNode() 方法根据用户输入给实体一些值,所以我在这两种情况下都调用了它。

session.beginTransaction();
node = (Node)session.createQuery("from Node").uniqueResult();
if (node == null) {
    node = new Node();
    updateNode();
    session.save(node);
} else {
    updateNode();
}
session.getTransaction.commit();

除了使用查询之外,还有更好的方法来检查表中是否存在行吗?

【问题讨论】:

  • 是的。不要先检查!
  • @Strawberry 你能解释更多吗?

标签: mysql hibernate jakarta-ee


【解决方案1】:

Is the cat alive or dead?不检查不知道,所以你必须在数据库中执行查询。

我假设您的问题是要避免手动编写这样的查询,而是让 Hibernate 自己完成。那你可能想看看querying by example/prototype

无论采用何种方法,请牢记并发问题;您可能想要应用一些独特的约束和/或乐观/悲观锁。

【讨论】:

    【解决方案2】:

    找出数据库中是否已经存在某些内容的唯一方法是查询它。但是,您不需要单独的查询。由于 mysql 的INSERT... ON DUPLICATE KEY UPDATE 功能,您只需要一个查询而不是两个查询。而且它也不需要任何额外的java编码。

    如果您想使用 hibernate 执行此操作,则必须是自定义查询,并且您需要在查询中返回带有 LAST_INSERT_ID 的插入行 ID。

    【讨论】:

    • 这可以用休眠查询语言吗?那么其他 DBMS 呢?这个功能是否只针对mysql?
    • 此功能在 Postgresql 9.4 之前不可用,但我知道它计划在 9.5 中使用。 sqlite 没有该功能,但它具有 INSERT OR IGNORE 功能,可以立即跟进更新。不知道别人
    • 但没有特定的休眠方式?
    • no hibernate 没有内置任何东西来处理它AFAIK。更新了答案。您将需要一个自定义查询。 @SQLInsert
    猜你喜欢
    • 2016-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-18
    • 2010-12-27
    • 2011-09-29
    相关资源
    最近更新 更多