java - Hibernate 可以使用 MySQL 的 "ON DUPLICATE KEY UPDATE"语法吗?

标签 java mysql hibernate orm

MySQL 支持“INSERT ... ON DUPLICATE KEY UPDATE ...”语法,允许您“盲目”插入数据库,并回退到更新现有记录(如果存在) .

当您想要快速隔离事务并且要更新的值取决于数据库中已有的值时,这很有用。

作为一个人为的例子,假设您想要计算某个故事在博客上的浏览次数。使用此语法的一种方法可能是:

 INSERT INTO story_count (id, view_count) VALUES (12345, 1)
 ON DUPLICATE KEY UPDATE set view_count = view_count + 1

这将比开始交易和处理新故事登上首页时不可避免的异常更有效。

我们怎样才能用 Hibernate 做同样的事情,或者完成同样的目标?

首先,Hibernate 的 HQL 解析器会抛出异常,因为它不理解特定于数据库的关键字。事实上,HQL 不喜欢任何显式插入,除非它是“INSERT ... SELECT ....”。

其次,Hibernate 将 SQL 限制为只能选择。如果您尝试调用 session.createSQLQuery("sql").executeUpdate(),Hibernate 将抛出异常。

第三,Hibernate 的saveOrUpdate 不适合这种情况。您的测试将通过,但如果每秒有超过一位访客,您将遇到生产失败。

我真的必须颠覆 Hibernate 吗?

最佳答案

你看过 Hibernate @SQLInsert 吗?注释?

@Entity
@Table(name="story_count")
@SQLInsert(sql="INSERT INTO story_count(id, view_count) VALUES (?, ?)
 ON DUPLICATE KEY UPDATE view_count = view_count + 1" )
public class StoryCount

关于java - Hibernate 可以使用 MySQL 的 "ON DUPLICATE KEY UPDATE"语法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48568921/

相关文章:

php - 使用 datepicker jquery ajax php 更新 mysql 数据库字段

查询之间的Mysql日期不起作用

java - 如果我们使用@OneToMany注释,我们是否必须在数据库中本地定义一对多关系

java - 在 rcon 客户端上显示来自游戏服务器的控制台源

java - 使用 Spring Boot 和 Hibernate 强制执行外键约束的替代方法

java - 流关闭 IO 异常 Java

java - org.hibernate.MappingException : Unable to find column with logical name in Spring Hibernate

java - 如何用java制作一个数字三角形

java - 如果输入值不为空则更新列,否则忽略并保留数据库中列的现有值

java - @OneToMany 注解引起的异常