Java 休眠聚合

Java 休眠聚合,java,hibernate,hibernate-annotations,Java,Hibernate,Hibernate Annotations,是否有可能直接从hibernate获取此结果 List<Map<Sth, List<SthLog> list; 我知道这似乎是一个愚蠢的问题,因为通常您可以添加双向映射,但在这种情况下,我可以更改实体定义,我想知道是否可以直接从hibernate获得所需的结构。只是不要指望hibernate为您做所有事情。将列表转换为地图(或番石榴多重地图,在这里更容易、更合适)只需3行代码: // get all the SthLog with their sth List<S

是否有可能直接从hibernate获取此结果

List<Map<Sth, List<SthLog> list;

我知道这似乎是一个愚蠢的问题,因为通常您可以添加双向映射,但在这种情况下,我可以更改实体定义,我想知道是否可以直接从hibernate获得所需的结构。

只是不要指望hibernate为您做所有事情。将列表转换为地图(或番石榴多重地图,在这里更容易、更合适)只需3行代码:

// get all the SthLog with their sth
List<SthLog> list = 
    session.createQuery("select s from SthLog s inner join fetch s.sth").list();
// index them by their sth
ListMultimap<Sth, SthLog> result = ArrayListMultimap.create();
for (SthLog sthLog : list) {
    result.put(sthLog.getSth(), sthLog);
}
//用sth获取所有的SthLog
列表=
createQuery(“从SthLog的内部连接获取s.sth中选择s”).list();
//用他们的某物索引他们
ListMultimap结果=ArrayListMultimap.create();
for(SthLog SthLog:list){
result.put(sthLog.getSth(),sthLog);
}

我可以想象一个
列表将包含什么内容(所有的SthLog)。我还可以想象一张
地图将包含什么内容(所有的SthLog,由Sth索引)。但是
列表将包含什么呢。。。事实上,我真的需要像Mapyeah这样的东西,这当然是真的,没有太多的代码行,但是这种解决方案的效率如何,比如如果你有很多记录,就把一个容器重写成另一个容器?我只是根据你的经验在理论上提出这个问题,因为也许在这个具体问题上,说服实体设计师做双向映射会更好。你好,Hibernate也会这么做的。您可以用iterate()或scroll()代替list(),但我认为不会有太大变化。从列表创建映射比执行从外部数据库返回大量数据的SQL查询要快很多个数量级,外部数据库甚至可能在不同的机器上。是的,但是向下钻取,hibernate缓存不是以某种方式获取结果吗?因此,在缓存中的某个位置拥有完整的容器可能会更快?!(这是只读表)而不是从数据库中获取结果。我不知道这可能需要做一个具体的测试。无论如何,谢谢你的帮助。Hibernate在它的一级缓存中缓存实体。获取实体的方式并不重要。它不会缓存查询结果。
// get all the SthLog with their sth
List<SthLog> list = 
    session.createQuery("select s from SthLog s inner join fetch s.sth").list();
// index them by their sth
ListMultimap<Sth, SthLog> result = ArrayListMultimap.create();
for (SthLog sthLog : list) {
    result.put(sthLog.getSth(), sthLog);
}