Q: Error java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to Reportes.PeliculaC Tengo ese error a la hora de imprimir una lista en un Reporte usando JasperReport.
En consola, el código es así:
Session s = NewHibernateUtil.getSessionFactory().openSession();
   //Ejercicio 2 HQL: Establecer el primer nombre del cliente y los pagos que este ha recibido (Sumatoria)
   String hql = "select\n" +
                "    c.categoryId as IdCategoria,\n" +
                "    c.name as nombre,\n" +
                "    count(*) as Cantidad\n" +
                "from Category c\n" +
                "inner join c.filmCategories fc\n" +
                "group by c.name";

   Iterator iterador  = s.createQuery(hql).list().iterator();

    while(iterador.hasNext()) {
        Object obj[] = (Object[]) iterador.next();
        System.out.println(obj[0]+" - "+obj[1] +" - "+obj[2]);
    }
    s.close();

Lo que me imprime:
1 - Action - 64
2 - Animation - 66
3 - Children - 60
4 - Classics - 57
5 - Comedy - 58
Entonces, al hacer lo mismo en un Form usando java.swing y JasperReports, obtengo el error: 

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to Reportes.PeliculaC

Usando el siguiente código (class CategoriaPelicula):
package Reportes;
import POJO.Category;
import POJO.Film;
import POJO.FilmCategory;
import POJO.FilmCategoryId; 
import jasperreport.NewHibernateUtil;
import java.util.ArrayList;
import java.util.List;
import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRField;
import org.hibernate.Session;
public class CategoriaPelicula implements JRDataSource{
   private List<PeliculaC> lista4 = new ArrayList<PeliculaC>();
   //PeliculaC[] peli = null;
   private int indiceFact = -1;

@Override
public boolean next() throws JRException {
    return ++indiceFact < lista4.size();
}

@Override
public Object getFieldValue(JRField jrf) throws JRException {
     Object valor = null;


     if("IdCategoria".equals(jrf.getName()))
   {
       valor = String.valueOf(lista4.get(indiceFact).getIdCategoria());
   }
   if("Nombre".equals(jrf.getName()))
   {
       String x = lista4.get(indiceFact).getNombre();
       valor = x;
   }
   if("Cantidad".equals(jrf.getName()))
   {
       valor = String.valueOf(lista4.get(indiceFact).getCantidad());
   }

   return valor;
}

public void addPeliculaC(PeliculaC c){
    this.lista4.add(c);
}
public void Limpiar(){
    if(indiceFact == -1)
        indiceFact = -1;
    else
        indiceFact -= 1;
}
}

Y aquí es donde lo mando a imprimir al Reporte:
Session s = NewHibernateUtil.getSessionFactory().openSession();
     try
    {   
        Query query =  s.createQuery("select\n" +
                                    "    c.categoryId as idCategoria,\n" +
                                    "    c.name as nombre,\n" +
                                    "    count(*) as Cantidad\n" +
                                    "from Category c\n" +
                                    "inner join c.filmCategories fc\n" +
                                    "group by c.name");

        List<PeliculaC> elist = query.list();

          for (PeliculaC e: elist)
        {
           DataSource4.addPeliculaC(e);
        }


   }catch( Exception io)
    {     JOptionPane.showMessageDialog(null, "Fallo de conexion: "+io.toString());

    }finally
    {  
        s.close();    
    }

Supongo que el error está en mi clase CategoriaPelicula y también, cuando lo mando a imprimir, porque en consola uso un iterador, pero no tengo idea de cómo usar ese mismo iterador para imprimir la lista de objetos en el Reporte.

A: Antes de comenzar, recalco que yo no sé sobre la libreria JasperReport e intente ver la documentación pero no había una pública, encontre una pero creo que está desactualizada en comparación a la tuya debido a que no encontre la clase que muetras en cuyo código, ahora bien, he encontrado algunas partes causantes del problema.
En la solicitud(String)
Aparentemente te estás equivocando en establecer el de Swing, como se podría ver en el primer código que se muestra en consola, en la segunda linea está establecida como c.categoryId as IdCategoria,\n mientras que el de Swing tiene c.categoryId as idCategoria,\n, errores de minúscula y mayúscula. Como dije antes no sé nada de la librería por lo que no sé si la solicitud podria darle el hecho de minúsculas y mayúsculas.
En el error originalmente mostrado, problemas con el uso del Polimorfismo
Como se podrá saber, estos tipos de errores son originalmente debido a que una instancia no pertencia a dicho tipo que se le intento guardar su valor y boom ¡ClassCastException aparece! principalmente se podría usar el uso de instanceof para evitar esos errores.
Pero espera, con lo que acabo decir no pueda tal vez ayudarte concretamente, entonces iré al grano con el código, debido a que el problema se debe a que se está intentando de convertir implicitamente una instancia a otro tipo mediante el bucle-for de un objeto de tipo List y por consiguente el error nos muestra que los datos que se guarda en List son de tipo Object[] entonces cuando se intenta hacer un polimorfismo desde una instancia de tipo Object[] a Reportes.PeliculaC el error aparece ya que como se podrá saber son dos tipos totalmente diferente.
Espera, espera.. ¿Cómo sabes si los objetos que se almacenan en List son instancias de tipo Object[]?
Como se podría apreciar el mensaje de la excepción nos dice de una clase llamada [Ljava.lang.Object; pero ¿Qué significa esto con que es un tipo Object[]? En Java tiene signaturas para reconocer uno ciertos tipos de datos y como se podría ver en la documentación oficial vemos que [ pertenece a un Array y con cuanto más halla de ese simbolo significa que el Array lleva más dimensiones es decir como [[ = [][] luego observamos que toca a L<la ruta de la clase>; que correspondería a una clase en este caso es Ljava/lang/Object; por lo que concluimos que el Ljava/lang/Object; viene siendo Object[].
Y.. ¿Cómo cuales soluciones podría hacer en este caso?
Pues dejame decirte que puedes hacer dos soluciones, la primera es usar como en el primero código que hiciste en la consola, usando un Iterator y convertir los objetos proveniente de el a un Object[] que como el caso coinciden y no lanza ningun error, pero si fuera PeliculaC o PeliculaC[] totalemnte lanzaría un error con el que acabas de encontrar.
Otra solucion con el mismo código es en vez de convertirlo en un PeliculaC sino como un Object y también usar el instanceof, por ejemplo.
List<?> elist = query.list();
for (Object obj : elist) {
    if (obj instanceof Object[]) {
       /* 
        * Intenta de obtener los datos de Object[] y
        * crear una nueva instancia de PeliculaC con esos datos
        */
    } else if (obj instanceof PeliculaC) {
        /*
         * Aquí añadirlo a la lista como originalmente fue
         */
    } else {
        /*
         * ¿¡Me acabas de decir que el objeto que está almacenado
         * en esta lista no son de los anteriores!?
         * 
         * Si es el caso, intenta revisar el código, ¡que estarías
         * perdiendo datos sin que te des cuenta por un error de
         * suelto por allí!
         */
         throw new RuntimeException("Objeto no es una instancia de Object[] ni de PeliculaC");
    }

}


A: No nos das más información pero suponemos que el error lo tienes en la línea:
List<PeliculaC> elist = query.list();

La cosa es que query.list() devuelve una lista de Object[] y a esto es imposible hacerle el cast a Pelicula o a cualquier otra cosa.
En el primer caso, donde te funciona
Iterator iterador  = s.createQuery(hql).list().iterator();

el iterador es generico, nada de tipos concretos. Y cuando iteras obtienes Object[]. Por eso te funciona.
Haz lo mismo en el segundo caso:
List<Object[]> elist = query.list();
for (Object[] obj : elist) {
    // ...
}

y verás como te funciona sin errores. Si quieres obtener objetos de tipo PeliculaC debes crearlos dentro del bucle en base a los valores de cada Object[].
Espero que te sirva.
