Błędny typ obiektu

0

Witam, pisze prostą aplikacje która posiada listy i dane studentów na poszczególnych wydziałach. Działa to w oparciu o baze danych.

Mam problem w przypisaniu obiekty typu Student do obiektu typu Student

package swingproject;

....
import swingproject.DataBase.*;

public class Interface extends JFrame {

    ......
    ......
    ......
    private List<Faculty> facultiesList = new ArrayList<Faculty>();
    private int idStudent = -1;
    private int idFaculty = -1;


    private void updateDataStudent() {
        idStudent = list.getSelectedIndex();

        if (facultiesList.get(idFaculty).getStudent().isEmpty() || idStudent < 0) {
            name.setText("");
            surname.setText("");
            id.setText("");
            address.setText("");
            city.setText("");
        } else {
            Student tmp = facultiesList.get(idFaculty).getStudent().get(idStudent);
              
            
            name.setText(tmp.getName());
            surname.setText(tmp.getSurname());
            id.setText(String.valueOf(tmp.getId()));
            address.setText(tmp.getAddress());
            city.setText(tmp.getCity());
            dateBirth.getModel().setValue(tmp.getDatebirth());
        }
    }

    .......
}

Problem leży dokładnie w linijce

Student tmp = facultiesList.get(idFaculty).getStudent().get(idStudent);

Błąd

Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to swingproject.DataBase.Student

klasa Faculty i Student

package swingproject;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import swingproject.DataBase.*;

public class Faculty {

    private List<Student> students = new ArrayList<>();
    private String name;
    private int idFaculty;

    public Faculty(String name, int idFaculty) {
        this.name = name;
        this.idFaculty = idFaculty;
    }

    public String getName() {
        return name;
    }

    public Faculty(String name, List<Student> student) {
        this.name = name;
        this.students = student;
    }

    public int getIdFaculty() {
        return idFaculty;
    }

    public List<Student> getStudent() {
        return students;
    }

    public void setStudent(List<Student> student) {
        this.students = student;
    }

    public int getNumberStudents() {
        return students.size();
    }

    public void addStudent(int id, String name, String surname, Date dateOfBirth, String address, String city) throws Exception {
        if (id < 1) {
            throw new Exception("Bad id");
        }
        if (name.isEmpty() || surname.isEmpty() || address.isEmpty() || city.isEmpty()) {
            throw new Exception("Bad data");
        }

        students.add(new Student(id, name, surname, dateOfBirth, address, city));
        sort();
    }

    public void removeStudent(int id) {
        if (id > -1) {
            students.remove(id);
            sort();
        }
    }

    public void editStudent(Student student, int index) {

        if (index > -1) {
            //students.get(index).editData(student.getId(), student.getName(), student.getSurname(), student.getDatebirth(), student.getAddress(), student.getCity());
            sort();
        }
    }

    public void sort() {
        if (students.size() <= 1) {
            return;
        }
        for (int i = 0; i < students.size(); i++) {
            for (int j = 0; j < students.size() - 1; j++) {
                if (students.get(j).getId() > students.get(j + 1).getId()) {
                    Collections.<Student>swap(students, j, j + 1);
                }
            }
        }
    }

    public int findStudent(int id) {
        int index = -1;

        for (int i = 0; i < students.size(); i++) {
            if (students.get(i).getId() == id) {
                index = i;
                break;
            }
        }
        return index;
    }

}
package swingproject.DataBase;

import java.io.Serializable;
import java.util.Date;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.xml.bind.annotation.XmlRootElement;


@Entity
@Table(name = "STUDENT")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Student.findAll", query = "SELECT s FROM Student s"),
    @NamedQuery(name = "Student.findById", query = "SELECT s FROM Student s WHERE s.id = :id"),
    @NamedQuery(name = "Student.findByName", query = "SELECT s FROM Student s WHERE s.name = :name"),
    @NamedQuery(name = "Student.findBySurname", query = "SELECT s FROM Student s WHERE s.surname = :surname"),
    @NamedQuery(name = "Student.findByDatebirth", query = "SELECT s FROM Student s WHERE s.datebirth = :datebirth"),
    @NamedQuery(name = "Student.findByAddress", query = "SELECT s FROM Student s WHERE s.address = :address"),
    @NamedQuery(name = "Student.findByCity", query = "SELECT s FROM Student s WHERE s.city = :city")})
public class Student implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @Column(name = "ID")
    private Integer id;
    @Column(name = "NAME")
    private String name;
    @Column(name = "SURNAME")
    private String surname;
    @Column(name = "DATEBIRTH")
    @Temporal(TemporalType.DATE)
    private Date datebirth;
    @Column(name = "ADDRESS")
    private String address;
    @Column(name = "CITY")
    private String city;
    @JoinColumn(name = "IDFACULTIES", referencedColumnName = "IDFACULTIES")
    @ManyToOne
    private Faculties idfaculties;

    public Student() {
    }

    public Student(Integer id, String name, String surname, Date datebirth, String address, String city) {
        this.id = id;
        this.name = name;
        this.surname = surname;
        this.datebirth = datebirth;
        this.address = address;
        this.city = city;
    }

    public Student(Integer id) {
        this.id = id;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSurname() {
        return surname;
    }

    public void setSurname(String surname) {
        this.surname = surname;
    }

    public Date getDatebirth() {
        return datebirth;
    }

    public void setDatebirth(Date datebirth) {
        this.datebirth = datebirth;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public Faculties getIdfaculties() {
        return idfaculties;
    }

    public void setIdfaculties(Faculties idfaculties) {
        this.idfaculties = idfaculties;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (id != null ? id.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Student)) {
            return false;
        }
        Student other = (Student) object;
        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
       return String.valueOf(id) + ",  " + name + " " + surname;
    }

}
0

Dodam tylko że nie mam nigdzie zaimportowanej innej klasy Student ponadto w tym projekcie kiedyś była inna klasa Student jednak ją usunąłem i nie ma po niej śladu w plikach czy importach, jednak może siedzieć w jakiś plikach konfiguracyjnych(?), tego niewiem, szukałem ale bez skutku

0

A moze nadpisz prawidłowo metodę equals i hashcode?

0

Te metody są wygenerowane automatycznie, szczerze powiedziawszy niewiem jak można je inaczej napisać i też jaki to może mieć z tym związek. Prosze o wytłumaczenie może faktycznie w tym tkwi problem

0

Proponuje rozbic problematyczna linijke na pojedyncze instrukcje i wówczas będziesz wiedzieć gdzie leży problem.

0

No właśnie to nic nie dało, instanceof mowi że to nie typ Student także już tutaj jest coś nie tak, debbuger pokazuje że na pewno w tych listach coś jest i jest to typu Student

ponadto zamiast dać typ Student zamieniłem wszędzie na pełną ścieżkę włączając paczke, to także nic nie dało

0

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to swingproject.DataBase.Student

Hmm, wydaje mi się, że jakimś sposobem w List<Student> wylądował element typu Object[] (tzn tablica Objectów). Nie widzę skąd mógłby wejść, ale może to zła konfiguracja ORMa?

0

No to sprawdź jak tworzysz ta listę. Moze z bazy danych dostajesz objecty i trzeba to najzwyczajniej rzutować na typ student

0

po rozbiciu tego w taki sposób

Faculty fac = facultiesList.get(0);
 List<Student> lis = fac.getStudent();
Student std = lis.get(0);

Dalej ten sam błąd przy pobraniu już z listy Studenta i przypisaniu go, jednak debbuger pokazał że obiekty w liście są typu Object[] jednak takie rzutowanie nie pomogło

Student std = (Student)lis.get(0);
0

No to sprawdzaj dalej skąd w Faculty lista objectow. Pewnie zaraz dojdziemy tak jak napisal @Wibowit do orm

0

Doszedłem do tego, problem leżał w metodzie pobierającej Studentów z bazy

  public List<Student> getStudents(int idFaculty) {
        if (!entityManager.isOpen()) {
            return null;
        }
        List<Student> list = new ArrayList<>();
        try {
            String que = "select s.* from FACULTIES f, STUDENT s where s.IDFACULTIES = f.IDFACULTIES and f.IDFACULTIES = " + idFaculty;
            Query query = entityManager.createNativeQuery(que, Student.class);
            list = query.getResultList();
           
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            return list;
        }

    }

do entityManager.createNativeQuery</code> zapomniałem dodać <code class="java">Student.class i ResultList zwracał Object[]

Dzięki za pomoc :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1