HQL查询是否始终命中数据库并获得结果?

我正在经历hibernate以及何时使用Criteria vs HQL ,我的理解是使用Hibernate,每当我们在两个实例中通过CriteriaHQL查询数据库时,hibernate将得到结果集并放入内存然后当我们调用它时再次查询,数据将从内存中获取而不是点击该数据库,我的理解是否正确?

另外正如您从下面提到的评论中看到的那样,有人建议Hibernate Criteria会从会话中获取数据,而HQL总会进入并命中数据库,因此对HQL查询的任何数量的多次调用都将进入并命中数据库,如果这是那么HQL导致的问题多于解决问题。

请对此提出建议,因为我对这种情况有点困惑。

参考问题

这取决于您正在进行的查询类型以及缓存设置。

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

基本上,如果您正在生成查询,您可能会访问数据库,例外情况是,如果您已缓存查询和参数。

Hibernate查询(无论您使用Criteria还是HQL)只会从会话缓存(第一级缓存)返回实体,如果您使用@Id获取它。

要缓存查询,您可以使用以下语法:

 session.createQuery("from X as x").setCacheable(true); 

编辑评论:

查询与获取@Id的查询不同。 要通过@Id获取对象,您可以编写如下内容:

 Entity myEntity = sessionFactory.getCurrentSession().get(Entity.class, 1);