2011-12-21 2 views
1

Y a-t-il un moyen dans JPA de convertir des valeurs de clauses de sélection aléatoires en utilisant createNativeQuery à un objet de domaine. L'objet de domaine n'est pas géréjpa convertir les valeurs scalaires de SQL natif en entité

J'ai la requête SQL

select name, count(*) as cnt, sum(average_events)/count(*) as avg_events from (complex subquery) 

suivant, je veux convertir les valeurs a, b, c dans un objet de domaine avec trois variables d'instance a, b et c. Cet objet de domaine n'est pas géré par JPA et n'a donc pas @Entity et aucune table correspondante.

Actuellement, je suis en train de faire ce qui suit, qui retourne une liste d'objets.

Query query = objectManager.getEntityManager().createNativeQuery(sqlStr); 
List resultList = query.getResultList(); 

Répondre

5

Utilisez cette syntaxe:

SELECT new foo.MyCustomObject(a, b, c) FROM ... 

MyCustomObject est une classe avec consdtructor correspondant:

public class MyCustomObject { 
    private final String name; 
    private final int cnt; 
    private final float avg; 
    public MyCustomObject(String name, int cnt, float avg) { 
    this.name = name; 
    this.cnt = cnt; 
    this.avg = avg; 
    } 
    //...getters 
} 

prime Scala: classe équivalente:

class MyCustomObject(name: String, cnt: Int, avg: Float) 
//no, actually that's it 
+0

Je ne sais pas si je suis arrivé que .... je l'ai mis à jour par question – user373201

+0

@ user373201: Avez-vous essayé? la syntaxe 'SELECT new' va créer un objet pour vous et appeler un constructeur spécifié. Cela signifie que 'query.getResultList()' retournera un 'List ' plutôt qu'un 'List '. Aussi MyCustomObject peut être un objet * any * ayant un constructeur correspondant. J'ai mis à jour les noms de champs de 'MyCustomObject' afin qu'ils correspondent au nom utilisé dans votre requête. –

2

Il suffit de passer en le "résultatCl ass "à l'appel de createNativeQuery. Fonctionne certainement dans DataNucleus JPA.

+0

vrai, travaille également avec Hibernate et n'a pas besoin SELECT NEW() avec le code nécessaire pour boilerplate supplémentaire du constructeur ... voir « Requêtes SQL Native » dans http://www.oracle.com/technetwork/articles/ vasiliev-jpql-087123.html – Gregor