2010-05-20 12 views
7

Ist es mit JPA möglich, Instanzen von Nicht-Entitätsklassen mit systemeigenen Abfragen abzurufen?
Ich habe eine nicht-Entity-Klasse, die zwei Entitäten wickelt:Wählen Sie Nicht-Entitäten mit JPA?

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

Wie kann ich so etwas tun?

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

Antwort

18

Ist es möglich, mit JPA ein Instanzen eines nicht-Entitätsklassen mit nativen Abfragen abzurufen?

Nr Native Queries können Objekte zurückgeben nur (wenn Sie ihnen sagen, dies zu tun, indem Sie die resultClass oder eine resultSetMapping zum createNativeQuery Methode übergeben, wenn Sie nicht tun, werden Sie Sammlungen von Rohdaten erhalten) .

In JPQL können Sie Konstruktorausdrücke (SELECT NEW ...) mit einem Nicht-Entitätskonstruktor verwenden. Dies wird jedoch für native Abfragen nicht unterstützt. Sie müssen dies manuell tun.

+0

Hallo @Pascal ich Konstruktor Ausdrücke mit einem Nicht-Entity-Konstruktor zu verwenden versuchen. Mein SQL sieht so aus: 'SELECT NEW com.company.ui.EntityIDKey (c.companyId, c.name) FROM Firma c WHERE c.companyId ist nicht null und c.name ist nicht null und länge (trim (c.name))> 0 order by c.name asc' und mein JPA code: 'Liste companies = getEntityManager(). CreateQuery (sql) .getResultList();' aber am Ende bekomme ich eine Art Sicherheitswarnung. Wie vermeide ich das? –

-1

Ich denke, ich habe die Lösung gefunden. Es gibt eine Möglichkeit, das Schlüsselwort NEW beim Erstellen der Abfrage zu verwenden. Was ich dieses Problem resovle tat:

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(); 
} 

Die Product ist ein nicht-Entitätsobjekt, ein einfaches Objekt Ebene Serialiabale implementieren. Aber Sie müssen den entsprechenden Konstruktor definieren.

glücklich :-) Codierung

Danke und Grüße, Hari

+1

Aber Redfield bitten, Operator NEW in nativer Abfrage zu verwenden! nicht jpa Abfrage. So ist es möglich, diese Abfrage als createNativeQuery verwenden –

+0

Vielen Dank, aber das ist nicht die Antwort für native Abfrage. – ForNeVeR