如果只有id可用,删除对象的最佳方法(性能方面)。
HQL。执行这个HQL会将SessionContext对象加载到hibernate持久化上下文吗?
for(int i=0; i<listOfIds.size(); i++){
Query q = createQuery("delete from session_context where id = :id ");
q.setLong("id", id);
q.executeUpdate();
}
按ID加载并删除。
for(int i=0; i<listOfIds.size(); i++){
SessionContext session_context = (SessionContext)getHibernateTemplate().load(SessionContext.class, listOfIds.get(i));
getHibernateTemplate().delete(session_context) ;
}
此处SessionContext是映射到session_context表的对象。 或者,当然还有一个不同的,更好的方法吗?
答案 0 :(得分:7)
在这两个中,第一个更好,你将节省内存。如果要删除实体并且您拥有该ID,则首选编写HQL。
在你的情况下,有第三个更好的选择,
尝试下面的内容,
//constructs the list of ids using String buffer, by iterating the List.
String idList = "1,2,3,....."
Query q = createQuery("delete from session_context where id in (:idList) ");
q.setString("idList", idList);
q.executeUpdate();
现在,如果列表中有4个项目,则只会触发一个查询,之前会有4个。
注意: - 为了使上述工作正常,session_context
应该是一个独立的表。
答案 1 :(得分:3)
List<Long> idList = Arrays.asList(1L, 2L, 3L);
Query q = createQuery("delete from session_context where id in (:idList) ");
q.setParameterList("idList", idList);
q.executeUpdate();
<强>更新强> 我必须对此进行更新,在我们的环境中,最终结果表明,使用setParameterList提供的性能要差得多,而不是创建一个字符串manualy并使用像@ManuPK建议的setString。
答案 2 :(得分:2)
您还应该考虑缓存 - 第一级(会话)和第二级缓存。
如果删除是事务中的唯一或第一个操作,则第一个选项可能是最好的。
如果你查询一些SessionContext对象,然后调用HQL删除,那么查询缓存中的所有对象都将被逐出,因为hibernate不知道要删除哪些对象。第二种方法不是这种情况。
如果你使用二级缓存,那么它就更复杂,并且在很大程度上取决于你对SessionContext对象的处理方式。