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/913341/

相关文章:

java - R 发送邮件 ASPMX.L.GOOGLE.COM :25 cannot be opened

python - 使用棉花糖模式过滤 sqlalchemy 表更新

hibernate - 在删除实体之前,删除其父引用(如果有)

java - 即使我有级联,子对象也不会被删除

mysql - 先排序,再分组

java - hibernate : SetMaxResults not working with java. util.Map

java - 构建 yocto 图像时出现元 java 错误

java - 复合多项式误差

java - 无法解析符号 KeyEvent

php - SQL 值被更改为 1 而不是给定的值