2012-03-09 15 views
6

Jak mogę wybrać klasę obiektu w HQL? Kiedy należy wykonać następujące czynności:Jak wybrać klasę obiektu w HIbernate HQL?

select e.class, e.name from Entity e 

hibernacji powraca całkowitą (np [12 „nazwa”]) zamiast obiektu klasy. Jak mogę zwrócić klasę Java lub przynajmniej nazwę klasy lub jednostki? Lub, jeśli nie jest to możliwe, w jaki sposób mogę przekonwertować 12 na klasę Java?

Ze względu na wydajność, nie mogę zapytać pełne przedmiotów, tzn nie mogę zrobić

select e from Entity 

Pozdrowienia, Jochen

Odpowiedz

8

jeśli hibernate4, można użyć funkcji "typ HQL(), aby uzyskać typu jednostki

select type(e), e.name from Entity e 

Jeśli jesteś hibernate3 The session.iterate() podmiot powrót jako HibernateProxy tylko id i można uzyskać z niego nazwę jednostki & bez inicjowania.

Iterator iterator = session.createQuery("from Entity e").iterate(); 
while(iterator.hasNext()) { 
    HibernateProxy object = (HibernateProxy)iterator.next(); 
    System.out.println(object.getHibernateLazyInitializer().getIdentifier()); 
    System.out.println(object.getHibernateLazyInitializer().getEntityName()); 
} 
1

Skalar HQL, która wyraźnie określa nazwę kolumny w klauzuli select zwróci listę object[]. Każdy indeks w zwróconej tablicy pasuje do odpowiedniej kolumny w klauzuli select.

Aby zwrócić listę obiektów, użyj select e from Entity e lub po prostu from Entity.

List<Entity> result = (List<Entity>) session.createQuery("from Entity").list(); 

Aby ograniczyć rekord zwrócony przez HQL, stosować pewne warunki w klauzuli WHERE HQL, na przykład: from Entity e where e.name = xxxxx

+0

mnie uprzedził :) Po wybraniu jednostek, można użyć regularne wywołania getClass java, aby poznać zwróconą klasę. –

+0

Cześć, nie mogę tego zrobić, ponieważ szukam dwóch gazillionów z setkami różnych klas. Wynikowe zapytanie byłoby zbyt wolne. – Jochen

+0

można zastosować niektóre klauzula where w HQL? –

0

Jeśli chcesz ograniczyć liczbę kolumn na liście select , możesz nam operator new wewnątrz hql.

Oznacza to,

select new Entity(e.class, e.name) from Entity e 

również dodać odpowiedni konstruktor w klasie Entity że ta kwerenda może wykorzystać.

To da ci List<Entity>, zainicjalizowany tylko z 2 wartościami.

Jest to przydatne, gdy potrzebna jest migawka dużego obiektu w sposób performatywny. Przeczytaj here dla dokumentacji API lub here dla przykładu.

+1

Próbowałem tego, ale nie działało to z parametrami klasy. Opuszczenie działa e.class. – Jochen

+0

jaka jest odpowiednia wartość dla ** klasy ** w DB?Mam nadzieję, że jest to ciąg znaków, następnie musisz ustawić ciąg znaków i spróbować pobrać ** klasę **. – ManuPK

+0

Jest to wbudowana własność Hibernate. Na przykład. w zapytaniach możesz zrobić: "wybierz e.name z Entity e, gdzie e.class = Person". Jednak 'select e.class' zwróci int, które muszę odwzorować na klasę. – Jochen

4

można po prostu użyć metody addEntity(), aby powiedzieć hibernacji korzystać z klasy do mapowania odpowiedź

Query query = session.createSQLQuery(
    "select e.class,e.name from Entity e where <your conditions>") 
    .addEntity(Entity.class) 
    List<Entity> result = query.list(); 
+3

Ale to nie jest HQL. –

Powiązane problemy