2013-03-11 10 views
5

Kiedy używam list() z Hibernate (HQL) po createQuery(), wtedy chcę bezpośrednio wpisać rzut List<Object[]> do mojego List<POJO class>. Opiszę tutaj mój rzeczywisty scenariusz. Mam 3 zwykłe stare obiekty Java, mówię o osobie, operacji i projekcie, a tabela mówi Transakcje z obcymi odniesieniami do osoby, operacji i projektu.hibernate HQL createQuery() list() typ rzutowany na model bezpośrednio

class Person { 
    String name; 
    // getters and setters 
} 

class Operation { 
    String name; 
    // getters and setters 
} 

class Project { 
    String name; 
    // getters and setters 
} 

class Transaction { 
    String p_id; 
    String o_id; 
    String project_id; 
    // refers to id of All three table above 
} 

Teraz chcę wykonać kwerendy Hibernate Query Language powiedzieć String query="select p.name, o.name, project.name from Person p , Operation o, Project project , Transaction t where p.id=2 and p.id=t.p_id and o.id=t.o_id and project.id=t.project_id".

Utworzyłem klasę Model dla wyniku tego zapytania, powiedzmy POP_Model.

private class POP_Model { 
    String person_name; 
    String operation_name; 
    String project_name; 
} 

Teraz chcę użyć kwerendy hibernacji:

Session session=HibernateConnection.getSessionFactory().openSession(); 
Query q=session.createQuery(query); 
List<POP_Model> list=(List<POP_Model>)q.list(); 

Daje typecast błąd mówiąc Object [] nie mogą być konwertowane do POP_Model. Sprawdziłem typedQuery, ale nie dostałem tego przykładu. Ale o ile mi wiadomo, TypedQuery może być użyty do odwzorowania na POJO a nie Model. Chcę bezpośrednio wpisać rzut do modelu.

+0

Jednym z podejść do lepszego rozwiązania problemu jest przejście na API kryteriów. –

+0

"Kryteria Api" oznacza? możesz wskazać dowolny link do niego. – Misha

Odpowiedz

6

Jeśli są OK, z użyciem API JPA (które Hibernate implementuje również) zamiast API Hibernate do tego można użyć JPQL zapytań Konstruktor:

List<DTO> dtos = entityManager.createQuery("SELECT NEW com.example.DTO(p.name, o.name) FROM Entity o").getResultList(); 

EDIT to wygląda narzędzi Hibernate konstruktora wyrażeń z jego regularne API także:

List<DTO> dtos = session.createQuery("SELECT NEW com.example.DTO(p.name, o.name) FROM Entity o").list(); 

EDIT2 JPA jest standardem Java EE, ujednolicenie pracy z innym trwałości librarie Są jak Hibernate i EclipseLink. oracle tutorial jest całkiem przyzwoity.

Można pobierać takie EntityManager w non-EE zastosowania takiego:

@PersistenceUnit 
    private EntityManagerFactory emf; 
    ... 
    EntityManager em = emf.createEntityManager(); 
+0

Po raz pierwszy spotkałem się z JPA API. Czy możesz zaproponować mi dobre linki do przykładu JPA. Używam aplikacji Struts 2. Po drugie, w jaki sposób mogę uzyskać obiekt entityManager? – Misha

+0

@Misha - dodałem kilka detialów, mam nadzieję, że pomogą ci dalej. IMO nie powinieneś ugrzęznąć, ucząc się nowego API, hibernacja oferuje tę funkcję natywnie, więc na razie pójdę z wersją hibernacji, o czym pomyśli keeeping JPA na później. – kostja

+0

@@ kostja: dziękuję ton. Użyłem session.createQuery() i działa poprawnie. – Misha

3

Najpierw utwórz konstruktor w klasie POJO.

private class POP_Model { 
    String person_name; 
    String operation_name; 
    String project_name; 

    public POP_Model(String person_name, String operation_name, String project_name){ 
     this.person_name = person_name; 
     this.operation_name = operation_name; 
     this.project_name = project_name; 
    } 
} 

Następnie można użyć

select new com.server.dtos.POP_Model(p.name, o.name, project.name) 
from Transaction t INNER JOIN t.operation o 
INNER JOIN t.person p 
INNER JOIN t.project project 
where p.id=2 

Dla porównania, tutaj jest official documentation. Przejdź także przez New object with HQL.

Powiązane problemy