我想运行查询,但结果应该是只读的。他们可能需要刷新,我不想刷新列表中的每个元素。我宁愿重新执行查询。因此,我希望将所有结果分开。我目前做的是
List<Ent> lst = (List<Ent>)em.createQuery("FROM Ent").getResultList();
for (Ent l:lst) em.detach(l);
但这对我来说似乎不对。
有更好的方法吗?
答案 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);