查询中的分离列表

时间:2011-07-25 06:16:31

标签: java hibernate jpa

我想运行查询,但结果应该是只读的。他们可能需要刷新,我不想刷新列表中的每个元素。我宁愿重新执行查询。因此,我希望将所有结果分开。我目前做的是

List<Ent> lst = (List<Ent>)em.createQuery("FROM Ent").getResultList();
for (Ent l:lst) em.detach(l);

但这对我来说似乎不对。

有更好的方法吗?

3 个答案:

答案 0 :(得分:3)

您似乎不希望返回的对象由持久性上下文管理。您可以考虑使用StatelessSession,因为使用StatelessSession返回的所有内容都处于分离状态且不受管理持久化上下文

StatelessSession session = sessionFactory.openStatelessSession();
List<Ent> lst  = session.createQuery("FROM DeviceTree").getResultList(); //All the returned Ent are in the detached state

请注意,StatelessSession没有实现第一级缓存,第二级缓存或查询缓存。您所做的一切都会导致立即执行SQL操作。您可以将其视为使用普通JDBC,除非您从映射的持久类中获益。


<强>参考

答案 1 :(得分:0)

也许Hibernate不支持detach()方法?您可以将实体复制到新的对象类型,并将这些分离的实体返回给调用者。

StackOverflow上有关于此主题的几个类似问题:Detach an entity from JPA/EJB3 persistence context

答案 2 :(得分:-2)

将列表设为unModifieable list

你的代码将是

List<Ent> lst = (List<Ent>)em.createQuery("FROM DeviceTree").getResultList();
lst =(List) Collections.unmodifiableCollection(lst );

样品

 List arl = new ArrayList();
        arl.add("sk");
        arl.add("sk2");
        System.out.println("...."+arl);
        arl =(List) Collections.unmodifiableCollection(arl);
try{
        arl.add("sk3");  // it will give exception
}catch(exception ex
{ex.printStackTrace();}     System.out.println("...."+arl);