Hibernate是否将配置的二级EhCache与此查找一起用于多个ID

Hibernate是否将配置的二级EhCache与此查找一起用于多个ID,hibernate,ehcache,hibernate-4.x,Hibernate,Ehcache,Hibernate 4.x,我正在使用Hibernate 4.3.11 我已经为我的歌曲类配置了二级缓存,但点击率不高,我想知道这是否是因为我通常按如下方式检索我的歌曲类 public static List<Song> getSongsFromDatabase(Session session, List<Integer> ids) { try { List<Song> songs = se

我正在使用Hibernate 4.3.11

我已经为我的歌曲类配置了二级缓存,但点击率不高,我想知道这是否是因为我通常按如下方式检索我的歌曲类

 public static List<Song> getSongsFromDatabase(Session session, List<Integer> ids)
        {
            try
            {
                List<Song> songs = session
                        .createCriteria(Song.class)
                        .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
                        .add(Restrictions.in("recNo", ids)).list();
                return songs;
            }
            catch (Exception e)
            {
                throw new RuntimeException(e);
            }
        }

这完全取决于如何配置二级缓存

如果一个实体被注释为
@Cache
,实际上,它将在
会话期间被缓存。get

对于查询,需要使其可缓存。这意味着在你的情况下,要做这样的事情:

List<Song> songs = session
  .createCriteria(Song.class)
  .setCacheable(true) // here
  .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
  .add(Restrictions.in("recNo", ids)).list();
列出歌曲=会话
.createCriteria(Song.class)
.setCacheable(true)//此处
.setResultTransformer(标准.DISTINCT\u ROOT\u实体)
.add(Restrictions.in(“recNo”,id)).list();

它不是通过主键检索的。它正在执行一个查询。要缓存此查询结果,您需要一个查询缓存。旁注:你的拦网真的没用。它们只会掩盖抛出的原始运行时异常。@JBNizet但recNo是主键,所以我只是以错误的方式检索它,也就是说,我可以通过主键检索多个记录而不将其视为一个查询吗?@JBNizet似乎在Hibernate 5之前我不能做我想做的事情-我希望在仅通过Id查找时避免添加queryCache,但是的,我得到了有效的结果。对于该查询,是否只将一个项添加到查询缓存中,或者是否为ids变量的每个不同值集添加一个项。查询缓存是否只存储ID,即与标准缓存相比,它的内存使用量是最小的,还是它实际存储了要检索的对象?我不确定。我认为如果实体也被缓存,那么查询将缓存ID列表,然后在实体缓存中解析它们。但请一定要测试一下。顺便说一句,既然select是在IDs上的,为什么要执行distinct?好的,我不知道我为什么要这么做(我想我只是想确定一下)!
List<Song> songs = session
  .createCriteria(Song.class)
  .setCacheable(true) // here
  .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
  .add(Restrictions.in("recNo", ids)).list();