2011-02-03 5 views
1

Hy all, J'ai trois tables Enfant, Animal et Jouet. Pet a une clé de référence pour l'identifiant de l'enfant, et un jouet a une clé de référence pour un identifiant de chien. Je veux charger toutes les données sur un enfant et ses animaux de compagnie, mais je ne veux pas charger les données de jouetsLe chargement paresseux ne fonctionne pas - jpa

@OneToMany(mappedBy = "petEntity", fetch = FetchType.LAZY) 
public Set<PetEntity> getPetEntitySet() { 
    return petEntitySet; 
} 

@ManyToOne(fetch = FetchType.LAZY) 
@JoinColumn(name = "ChildId", insertable = false, updatable = false) 
public ChildEntity getChildEntity() { 
    return childEntity; 
} 

même pour voir des jouets.

pour charger les données que j'ai

List<ChildEntity> list = entityManager.createQuery(
"SELECT c FROM ChildEntity c "+ 
"LEFT JOIN FETCH c.petEntitySet ", 
ChildEntity.class).getResultList(); 
    return list; 

mais cette chose me charges toutes les données, pas seulement les informations sur l'enfant et ses animaux de compagnie.

Comment puis-je supprimer le gestionnaire d'entités à ne charger que les données de la table, et de ne pas faire les jointures quand je ne veux pas que

Merci pour vos conseils

j'ai oublié de mentionner que dans ce chenillard ne charge pas seulement toutes les données, mais il renvoie plus qu'une simple copie d'un enfant.

+0

Pourquoi pensez-vous qu'il charge toutes les données? – axtavt

Répondre

2

La raison pour laquelle il charge plus de données est que vous utilisez le mot-clé fetch. Cela va EAGERLY charger tous les animaux de compagnie de l'enfant. Il suffit de supprimer le fetch et le chargement paresseux se produira.

Mise à jour

Je vois que c'est en fait ce que vous voulez, si juste et assurer equals()hashCode() est correctement outrepassée dans toutes les classes concernées, comme je suppose que vous utilisez Set.
De cette façon, JPA sait comment rechercher des doublons

Deuxième mise à jour

Oui, vous pouvez facilement utiliser DISTINCT dans vos requêtes.

Il suffit d'ajouter dans votre sélection DISTINCT

List<ChildEntity> list = entityManager.createQuery(
"SELECT DISTINCT c FROM ChildEntity c "+ 
"LEFT JOIN FETCH c.petEntitySet ", 
ChildEntity.class).getResultList(); 
    return list; 
+0

je résous cela, j'ai un autre problème maintenant, si un enfant a plus de 1 animal de compagnie pour par exemple 3 dans la liste des résultats j'aurai 3 enfants chacun avec un animal de compagnie, et pas acild avec des parasites d'arbres (je suis ussng ensembles) , est-ce que je peux utiliser quelque chose comme une racine distincte, à partir de critères? –

+0

Regardez ma mise à jour pour la réponse –

+0

quelle était la solution exacte pour ce problème, j'ai des problèmes similaires. Avez-vous supprimé le mot clé 'fetch' de la requête ou des annotations dans vos entités? – Warz

Questions connexes