我的所有经理都有一个特定的查询方法,必须返回瞬态集合,但我想在执行后立即关闭查询。
tx.begin();
Query query=pm.newQuery(...);
Collection col=(Collection)query.execute();
pm.makeTransientAll(col,true);
query.close();
tx.commit();
问题:查询关闭后无法访问集合(DN知道身份?)否则会抛出"查询已关闭"错误!
解决方案:创建原始集合的COPY!
Collection col=new ArrayList((Collection)query.execute());
但我想避免这种情况......即使它是本地副本并且它不是深度克隆,它仍然会分配整个元素数组所需的空间(所以,在某些时候会有2倍的分配内存),我想避免这种情况。
我错过了什么? 有没有办法避免创建克隆?
答案 0 :(得分:0)
好吧,我找到了这种行为的原因:
如果实例为:org.datanucleus.store.rdbms.query。 ForwardQueryResult ,则返回查询对象(集合)
扩展: AbstractRDBMSQueryResult
扩展: AbstractQueryResult
扩展:抽象列表
所以,我得到一个LIST实现的对象,查询结果绑定到该实现。
/** The Result Objects. */
protected List resultObjs = new ArrayList();
/**
* Method to return the results as an array.
* @return The array.
*/
public synchronized Object[] toArray()
{
assertIsOpen();
advanceToEndOfResultSet();
return resultObjs.toArray();
}
所以,我无法避免创建一个新阵列......