2010-04-05 3 views
0

j'ai une requête SQLEclipseLink: Créer des objets de requête JOIN

SELECT * FROM Thing AS a JOIN Thing_Property AS b ON a.id=b.Thing_ID 
    JOIN Property AS c ON b.properties_ID = c.id 
    JOIN Item AS d ON c.item_ID = d.id 
    ORDER BY a.name, d.name 

et je EclipseLink pour créer mon modèle d'objet avec elle. Voici le modèle:

@SuppressWarnings("serial") 
@Entity 
public class Thing implements Serializable { 
    @Id 
    @GeneratedValue(strategy = GenerationType.TABLE) 
    private int id; 
    private String name; 
    @OneToMany(cascade=CascadeType.ALL) 
    @PrivateOwned 
    private List<Property> properties = new ArrayList<Property>(); 
    ... 
    // getter and setter following here 
} 
public class Property implements Serializable { 
    @Id 
    @GeneratedValue(strategy = GenerationType.TABLE) 
    private int id; 

    @OneToOne 
    private Item item; 

    private String value; 
    ... 
    // getter and setter following here 
} 
public class Item implements Serializable { 
    @Id 
    @GeneratedValue(strategy = GenerationType.TABLE) 
    private int id; 
    private String name; 
    .... 
    // getter and setter following here  
} 
// Code end 

mais je ne peux pas comprendre, comment faire EclipseLink créer le modèle à partir de cette requête. Pouvez-vous aider?

Répondre

2

Vous devrez utiliser l'API EntityManager.createNativeQuery (String sqlString, Class resultClass);

entityManager.createNativeQuery ("CHOISIR * FROM Chose EN TANT QUE JOIN Thing_Property AS b ON a.id = b.Thing_ID JOIN Propriété AS c ON b.properties_ID = c.id JOIN Elément AS d ON c.item_ID = d. id ORDER BY a.nom, d.nom ", Thing.class);

+0

Merci! Mais malheureusement cela fonctionne mais pas de la manière souhaitée. Au lieu d'avoir la propriété dans les propriétés de liste, j'obtiens un mappage 1: 1. Cela signifie que je devrais avoir 10 objets Thing avec 100 objets Property dans la liste des propriétés, mais j'ai maintenant 1000 objets Thing avec chaque objet 1 Property dans la liste des propriétés. Eclipselink ne fait pas le groupement. Pouvez-vous aider? – Raven

+0

Modifiez votre requête pour utiliser "select distinct a. *" Qui devrait réduire le nombre d'objets Thing retournés. Si vous tentez réellement de lire tous ces objets liés en une seule grande requête, je recommande d'utiliser l'indicateur de requête "eclipselink.join-fetch" de JPQL et EclipseLink pour récupérer les objets associés. Requête de requête = entityManager.createQuery ("Sélectionnez t de Thing T"); query.setHint ("eclipselink.join-fetch", "t.properties.item"); Vous devriez aussi pouvoir ajouter les indications à la requête native si nécessaire, mais il est préférable d'utiliser JPQL quand vous le pouvez car il est plus facile à maintenir. –