Wyświetlenie danych hibernate + java

0

Witam

Chciałbym wyświetlić dane z listy, której zawartość jest utworzona przez zapytanie hql:

select c.login, c.pass from Credential c

Pojawia się błąd:
"Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to model.Credential
at hibapplication4dotestów.Main.main(Main.java:35)
Java Result: 1"

Próbowałem w zasadzie wszystkiego co mi przyszło do głowy tj. rzutowania, etc, ale zawsze pojawia się wyjątek.

Funkcja, która zwraca listę:

    private List<Credential> wypiszCredentials(){
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        List result = session.createQuery("select c.login, c.pass from Credential c").list(); //from Credential; select c.login, c.pass from Credential c, Person p where c.personid=p.personid
        session.getTransaction().commit();
        return result;
    }

Wyświetlenie listy:

List<Credential> cred = main.wypiszCredentials();
        for(int a = 0; a< cred.size(); a++){
            //System.out.println(a);
            System.out.println(cred.get(a).getLogin() /*+ " " + cred.get(a).getPass()*/);

poniżej klasa Credential:

public class Credential {

    private Person person;

    private int personid;
    private String login;
    private String pass;

    public Credential() {
    }

    public Credential(String login, String pass) {
        this.login = login;
        this.pass = pass;
    }

    public String getLogin() {
        return login;
    }

    public void setLogin(String login) {
        this.login = login;
    }

    public String getPass() {
        return pass;
    }

    public void setPass(String pass) {
        this.pass = pass;
    }

    public Person getPerson() {
        return person;
    }

    public void setPerson(Person person) {
        this.person = person;
    }

    public int getPersonid() {
        return personid;
    }

    public void setPersonid(int personid) {
        this.personid = personid;
    }

    
}

Pozdrawiam

0

Spróbuj dodać typ listy, do której przypisujesz wynik zapytania:

private List<Credential> wypiszCredentials(){		
		
	Session session = HibernateUtil.getSessionFactory().openSession();
	Transaction transaction = null;
		
	List<Credential> result = null;
		
	try{
			
		transaction = session.beginTransaction();
		result = session.createQuery("select c.login, c.pass from Credential c").list();
			
		transaction.commit();
	}
	catch(HibernateException ex){
			
		if(transaction != null)
			transaction.rollback();			
	}
	finally{			
		session.close();			
	}
		
	return result;	
}
0

Jeżeli będę pobierał tylko wartość jedną wartość (String):

    private List<String>wypiszImie(){
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        List result = session.createQuery("select login from Credential").list(); 
        session.getTransaction().commit();
        return result;
    }

To mogę listę wyświetlić bez problemów.

Na wyświetlenie zapytania:

select login, pass from Credential

nie znalazłem póki co rozwiązania.

Pozdrawiam

0

http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/queryhql.html

mozesz stworzyc 2 argumentowy konstruktor w klasie Credential i tworzyc obiekty juz z hql'a - podobnie jak w dokumentacji w linki

select new Family(mother, mate, offspr)
from DomesticCat...

lub zwrocic bezposrednio listę ( z czego nigdy nie korzystalem )

select new list(mother, offspr, mate.name)...
0

Witam

select new Credential(login, pass) from Credential

Działa :-)

Czy można również w taki sposób wyciągnąć dane z kilku tabel?

0

to juz raczej musisz pomapowac odpowiednio relacje miedzy klasami i same klasy a wtedy wyszukiwac daną encję po prostu metodą find

0

tworząc ręcznie select definiujesz coś takiego jak projekcje. Jeżeli nie zdefiniujesz projekcji ręcznie (setProjection) to w wyniku masz listę List<Object[]> gdzie każdy wiersz jest tablicą tego co masz w selekcie.
czyli idąc dalej, jak chcesz różne tabele to robisz joina i w selekcie definiujesz które atrybuty chcesz.

Możesz używac zapisu new Coś(lista) w selekcie, możesz używac tam również HashMap, albo możesz sobie ustawić ResultTransfomer i ta konwersja będzie automatyczna.

0

Witam mam podobny problem z JPA. Wzorowałem się na tym tutorialu:
http://devlab.pl/2011/03/12/resulttransformer-to-ukryta-moc/

Lecz dalej otrzymuje listę tablic Object[]. Poniżej znajduje sie mój kod. Może mi ktoś mnie naprowadzić?

    public List getList() {
        EntityManager em = DBManager.getManager().createEntityManager();
        String s;
        String className = ZamowienieWs.class.getCanonicalName();
        s = "SELECT z.dlugosc, z.zaplata FROM ZamowienieWs z";
        list = em.createQuery(String.format(s, className)).getResultList();
        em.close();
        return list;
   
0

Probowałem mój problem rozwiazac w następujacy sposob ale wywala mi NullPointerException. Wie ktos co moge z tym jeszcze zrobić. Bardzo prosze o rade po jestem noobem w tej dziedzinie.

private List<ZamowienieWs> lista;
    

    public List getLista() {
        EntityManager em = DBManager.getManager().createEntityManager();
        Query query = em.createQuery("SELECT z.dlugosc, z.zaplata FROM ZamowienieWs z");
        List<Object[]> result = query.getResultList();
        ZamowienieWs zamowienie;
        for(Object[] objects: result)
        {
        zamowienie = new ZamowienieWs((Integer)objects[0], (Float)objects[1]);
        lista.add(zamowienie);
        }
        em.close();
        return lista;
    }

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