我正在经历休眠和情况何时使用Criteria vs HQL
我的理解是使用Hibernate,每当我们在两个实例中通过Criteria
或HQL
查询数据库时hibernate会得到结果集并放入内存然后当我们再次调用该查询时,数据将从内存中获取而不是点击该数据库,我的理解是否正确?
另外正如你从下面提到的评论中看到的那样,有人建议Hibernate Criteria从会话中获取数据,而HQL总是会命中数据库,因此对HQL查询的任何多次调用都会进入数据库并且如果是这种情况,那么HQL
会导致比解决问题更多的问题。
请对此提出建议,因为我对这种情况有点困惑。
参考question
答案 0 :(得分:7)
这取决于您正在进行的查询类型以及缓存设置。
Hibernate有三种缓存:会话缓存,查询缓存和二级缓存。会话缓存始终打开,但其他两个可以禁用。
通常,缓存不是支持Criteria API而非HQL的原因,反之亦然。它们大多只是基本相同的不同接口。
请参阅http://www.javalobby.org/java/forums/t48846.html和http://docs.jboss.org/hibernate/core/3.3/reference/en/html/performance.html
答案 1 :(得分:1)
基本上,如果您正在生成查询,那么您可能会访问数据库,例外情况是,如果您已缓存查询和参数。
Hibernate查询(无论您使用Criteria还是HQL)只会在会话缓存(第一级缓存)中返回实体,如果您使用@Id获取它。
要缓存查询,您可以使用以下语法:
session.createQuery("from X as x").setCacheable(true);
编辑评论:
查询与使用@Id的get不同。要通过@Id获取对象,您可以编写如下内容:
Entity myEntity = sessionFactory.getCurrentSession().get(Entity.class, 1);