2010-05-20 9 views
7

Czy w przypadku JPA można pobrać instancje klas innych niż encje z natywnymi zapytaniami?
Mam klasy niż podmiot, który owija dwa podmioty:Wybierz podmioty z JPA?

class Wrap{ 
    Entity1 ent1; 
    Entity2 ent2 
} 
@Entity 
class Entity1{ 
    ... 
} 
@Entity 
class Entity2{ 
    ... 
} 

Jak można zrobić coś takiego?

Query q = entityManager.createNativeQuery("native select here"); 
List<Wrap> list = q.getResultList(); 

Odpowiedz

18

Czy to możliwe, z JPA, aby pobrać instancje klas innych niż podmiot, z rodzimych zapytań?

nr Native zapytań może powrócić podmioty tylko (jeśli im powiedzieć, żeby to zrobić przekazując resultClass lub resultSetMapping do metody createNativeQuery; jeśli nie, dostaniesz zbiory danych surowych) .

W języku JPQL można używać wyrażeń konstruktora (SELECT NEW ...) z konstruktorem nie będącym jednostką. Ale nie jest to obsługiwane w przypadku natywnych zapytań, musisz to zrobić ręcznie.

+0

Hi @Pascal staram się używać wyrażeń konstruktor konstruktor nie jednostki. Mój SQL wygląda następująco: SELECT NEW com.company.ui.EntityIDKey (c.companyId, c.name) FROM Company c WHERE c.companyId nie ma wartości null, a c.name nie ma wartości null i length (trim (c.name)))> 0 porządku według c.name asc' i mojego kodu JPA: 'List firmy = getEntityManager(). CreateQuery (sql) .getResultList();' ale kończę z ostrzeżeniem o typie bezpieczeństwa. Jak tego uniknąć? –

-1

Myślę, że znalazłem rozwiązanie. Istnieje sposób użycia słowa kluczowego NEW podczas konstruowania zapytania. Co zrobiłem resovle ten problem:

public List<ProductType> getProductByName(String productName) { 
     String sqlQuery = "select DISTINCT **NEW** project1.ProductType(o.name, o.revision) from Lhproduct o where o.name = :prodname"; 
     Query qry = getEntityManager().**createQuery(sqlQuery);** 
     qry.setParameter("prodname",productName); 
     return qry.getResultList(); 
} 

ProductType jest obiektem non-podmiot, prosty zwykły przedmiot wdrożenia Serialiabale. Ale musisz zdefiniować odpowiedni konstruktor.

Szczęśliwy kodowania :-)

Dzięki i Pozdrawiam, Hari

+1

Ale Redfield poprosi o użycie operatora NEW w natywnym zapytaniu! nie zapytanie jpa. Tak więc możliwe jest użycie tego zapytania jako createNativeQuery –

+0

Dziękuję, ale to nie jest odpowiedź dla zapytania natywnego. – ForNeVeR