Il flush() in quel contesto non ti serve a nulla: stai facendo una query di selezione. Il flush() (e l'ho scritto) serve a sincronizzare i dati del DB con quelli che sono nel context attualmente... in pratica, serve A CHI SCRIVE (cioè, chi fa operazioni di INSERT/UPDATE/DELETE).

Poi, dici che ti va in eccezione, ma non posti nemmeno uno straccio di stackTrace... che ne sappiamo noi di che eccezione viene sollevata? La prima causa che mi viene in mente è che tu stia eseguendo un flush() senza che vi sia una transazione attiva... ma, appunto, se stai leggendo non hai bisogno di una transazione attiva.

Documentandomi meglio, ho visto che c'è la possibilità di dire al EntityManager di non usare la cache:
http://docs.oracle.com/javaee/6/tutorial/doc/gkjjj.html

Ed è anche possibile specificare che un'intera Entity non sia messa in cache, tramite l'annotation Cacheable(false)


Quindi, o specifichi

codice:
<shared-cache-mode>NONE</shared-cache-mode>

nel persistence.xml, oppure disabiliti la cache per una (o più) particolare Entity.


Ciao.