Hibernate批量删除问题

我使用这样的hql语句删除
[code="java"]
delete from User where id in(16.18)
[/code]

他发出的sql语句是:
[code="java"]
delete from t_user where id in (16 , 18)
[/code]

并没有发出查询16 18两个User对象,然后再删除这两个user对象

为什么说Hibernate批量删除效率低呢?那位解释解释
[b]问题补充:[/b]
[quote]
这个方式进行删除时,是不用对user对象进行查询了,所以效果跟JDBC一样快了,但是带来了个后果就是不能使用Hibernate的缓存了。在这里删除的数据,在缓存中是不能体现出来的,必须在后面进行主动的更新。
Java代码
session.flush();

[/quote]

session.flush(); 是将缓存数据与数据库数据同步

[quote]
这个操作带来的开销并不一定比查询出来再删除带来的开销要小的。

所以通常的删除方式是将要删除的对象找出来再进行删除。

[/quote]

“将要删除的对象找出来再进行删除。”
将事务提交时,hibernate也会执行session.flush啊

[b]问题补充:[/b]
[quote]你写HQL语句 当遇到解析不出的关键字时,Hibernate会直接把它翻译成普通的SQL语句进行操作的[/quote]

我写的HQL里面有解析不出的关键字吗?
谢谢

[code="java"]这个方式进行删除时,是不用对user对象进行查询了,所以效果跟JDBC一样快了,但是带来了个后果就是不能使用Hibernate的缓存了。在这里删除的数据,在缓存中是不能体现出来的,必须在后面进行主动的更新。
Java代码
session.flush(); [/code]
这里是不是session.flush,是session.evict(entity);
还是一句话,要么使用bulk update/delete方式,要么使用操作持久化对象方式,当使用bulk update时,不可避免导致一级缓存的脏读,Hibernate的解决方式仅仅是删除二级缓存。
所以通常的方式就是直接操作持久化对象,这要不会引起数据库与缓存的不一致。

[url]http://www.iteye.com/topic/21640[/url]

当然不是指写的hql语句的问题,而是它的api的问题

看看http://www.iteye.com/topic/265
http://www.iteye.com/problems/24892

并非所有操作效率都低,而是指部分API操作。

[quote]
[code="java"]delete from t_user where id in (16 , 18)

delete from t_user where id in (16 , 18)[/code]
并没有发出查询16 18两个User对象,然后再删除这两个user对象
为什么说Hibernate批量删除效率低呢?那位解释解释 [/quote]

这个方式进行删除时,是不用对user对象进行查询了,所以效果跟JDBC一样快了,但是带来了个后果就是不能使用Hibernate的缓存了。在这里删除的数据,在缓存中是不能体现出来的,必须在后面进行主动的更新。
[code="java"]session.flush();[/code]
这个操作带来的开销并不一定比查询出来再删除带来的开销要小的。

所以通常的删除方式是将要删除的对象找出来再进行删除。
[code="java"]为什么说Hibernate批量删除效率低呢?那位解释解释 [/code]
找出来进行一个个删除,如果要删除10条记录,就要进行20条SQL语句,当然效率不如直接使用delete from table where x=x 来得快了。当然,Hibernate有其自己的处理方式,就是使用in,但是对于数据库来说,当in内部的个数不明确时,不建议使用in的,因为SQL语句在DB的语句池中是可重用的,而不同个数的in操作的语句是不可重用的,这带来查询效率的问题。
再者,当数据量稍微过大时,使用in也不能达到多好的优化效果,如要删除1000条语句时,在in语句体内判断50个值,也得几百条SQL语句。
所以,使用了Hibernate注定了不能非常优良地使用DB。其效率的根本还是在于缓存,当系统设置了合理的缓存时,才能带来性能的提高,否则,其任何查询语句都不可能比直接使用JDBC来得更快(尤其是HQL生成的查询语句,其效率总是有这样那样的问题,要是设置不合理的话,一个语句跑个几十秒非常正常,而在JDBC连接时,使用Hint,可以使得查询在不到1秒内完成)。

你写HQL语句 当遇到解析不出的关键字时,Hibernate会直接把它翻译成普通的SQL语句进行操作的。