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<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つの可能性は、戻ってきたList実装が、シャッフルが呼び出す操作をサポートしていないことです。検証するリストのタイプを確認することもできますが、これが当てはまるとは思えません。

于 2012-06-21T07:13:28.417 に答える