Java 在JPA中修改查询结果

Java 在JPA中修改查询结果,java,google-app-engine,jpa,Java,Google App Engine,Jpa,如何克服此问题?将结果复制到辅助列表,并将其洗牌,而不是查询结果列表 java.lang.UnsupportedOperationException: Query result sets are not modifiable 也许是这样 ArrayList copyList = new ArrayList(); Collections.copy(copyList,list); Collections.shuffle(copyList); List profiles=null; List re

如何克服此问题?

将结果复制到辅助列表,并将其洗牌,而不是查询结果列表

java.lang.UnsupportedOperationException: Query result sets are not modifiable
也许是这样

ArrayList copyList = new ArrayList();
Collections.copy(copyList,list);
Collections.shuffle(copyList);
List profiles=null;
List results=(List)q.getResultList();
如果(结果!=null){
profiles=newarraylist();
profiles.addAll(结果);
收藏。洗牌(档案);
}

正如另外两个人所说,您应该将结果复制到自己的列表中,因为它们以只读模式返回。另一种可能是返回的列表实现不支持shuffle调用的操作。您还可以尝试查看要验证的列表类型,但我怀疑情况是否如此

排队

List<Profile> profiles = null;
List<Profile> results = (List<Profile>) q.getResultList();
if(results != null) {
    profiles = new ArrayList<Profile>();
    profiles.addAll(results);
    Collections.shuffle(profiles);
}
list=(list)q.getResultList();
之后,您应该基于结果创建一个新列表,如下所示:

list = (List<Profile>) q.getResultList();
List anotherList=newarraylist(listaOrdenes);
这样您就有了一个“新”列表,您可以修改它。

有两个选项:

1) 创建新列表(2)在查询中使用ORDERBY子句

排序(…)将对您提供的列表进行排序。因此,它将修改列表。但是,您尝试排序的列表是不可修改的。当Collections.sort(…)调用列表的某个方法来添加或删除元素时,它将引发异常

一种解决方案是从原始列表创建一个新的、可修改的列表,然后对该列表进行排序

 List<Profile> anotherList= new ArrayList<Profile>(listaOrdenes);
//创建一个新的ArrayList,其中包含列表“标识”中的所有元素
列表数据=新的ArrayList(标识);
//对新列表排序
收集、分类(数据);

但是,由于您可能是使用JPA查询从数据库获取列表,因此最好将数据库查询更改为包含“order by”子句,以便让数据库进行排序。您不需要在Java代码中进行排序。

想知道为什么从getResultList()返回列表无法直接洗牌。为什么不能修改返回的列表?我不知道细节,但我可以想象,例如,在请求第一个结果之前,查询不会执行。即使事务已提交且em已关闭,列表也会引发此异常:(强制复制整个列表以对其进行修改并不是很有用……一旦分离,它应该表现为普通列表。
 List<Profile> anotherList= new ArrayList<Profile>(listaOrdenes);
// Create a new ArrayList that contains all elements from the list 'identities'
List<Identity> data = new ArrayList<Identity>(identities);

// Sort the new list

Collections.sort(data);