2
EntityManager em = EMF.get().createEntityManager();
EntityTransaction tx = null;

List<Profile> list = null;
Query q = null;

try{
    tx = em.getTransaction();
    tx.begin();

    q = em.createNamedQuery("Profile.getRandomProfile");
    q.setParameter("random", Math.random());
    q.setMaxResults(8);
    list = (List<Profile>) q.getResultList();

    if (list != null){
        Collections.shuffle(list);
    }

    tx.commit();

} catch(NoResultException ex){
    System.out.println("ERROR CATCHED: " +ex.getMessage());
    if(tx != null && tx.isActive())
        tx.rollback();
} catch(Exception e){
    e.printStackTrace();
}
finally{
    em.close();
}

洗牌列表有错误:

java.lang.UnsupportedOperationException: Query result sets are not modifiable

如何克服这个问题?

4

5 回答 5

4

将结果复制到二级列表并打乱它而不是查询结果列表。

ArrayList copyList = new ArrayList();
Collections.copy(copyList,list);
Collections.shuffle(copyList);
于 2012-06-21T06:51:36.577 回答
2

在行

list = (List<Profile>) q.getResultList();

之后,您应该根据结果创建一个新列表,如下所示:

 List<Profile> anotherList= new ArrayList<Profile>(listaOrdenes);

这样,您就有了一个“新”列表,并且您可以对其进行修改。

于 2014-03-31T15:22:10.030 回答
0

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

于 2012-06-21T07:13:28.417 回答
0

也许像这样?

List<Profile> profiles = null;
List<Profile> results = (List<Profile>) q.getResultList();
if(results != null) {
    profiles = new ArrayList<Profile>();
    profiles.addAll(results);
    Collections.shuffle(profiles);
}
于 2012-06-21T06:58:24.737 回答
0

有2个选项:

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

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

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

// 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);

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

于 2017-08-29T04:15:59.563 回答