2010-04-20 6 views
0

Je suis très familier avec SQL/HQL, et je suis actuellement coincé avec ce « peut-être » problème simple:Hibernate HQL m: n rejoindre problème

J'ai deux beaucoup à plusieurs entités, avec une table de relation:

Voiture, CarProblem et Problème.

une voiture peut avoir de nombreux problèmes,

Un problème peut apparaître dans de nombreuses voitures,

CarProblem est la table d'association avec d'autres propriétés.

Maintenant, je veux trouver Car (s) avec problème spécifié, comment puis-je écrire un tel HQL? Tous les identifiants sont de type long.

J'ai essayé beaucoup de rejoindre/intérieur-join combinaisons, mais en vain ..

- Mise à jour:

Désolé, oubliez pas de mentionner:

voiture a beaucoup CarProblem

problème a beaucoup CarProblem

voiture et problème ne sont pas connectés directement à Java Object.

- mise à jour, le code java ci-dessous -

@Entity 
public class Car extends Model{ 
    @OneToMany(mappedBy="car" , cascade=CascadeType.ALL) 
    public Set<CarProblem> carProblems; 
} 

@Entity 
public class CarProblem extends Model{ 
    @ManyToOne 
    public Car car;  
    @ManyToOne 
    public Problem problem;  
    ... other properties 
} 


@Entity 
public class Problem extends Model { 
    other properties ... 
    // not link to CarProblem , It seems not related to this problem 

    // **This is a very stupid query , I want to get rid of it ...** 
    public List<Car> findCars() 
    { 
    List<CarProblem> list = CarProblem.find("from CarProblem as cp where cp.problem.id = ? ", id).fetch(); 
    Set<Car> result = new HashSet<Car>(); 
    for(CarProblem cp : list) 
     result.add(cp.car); 

    return new ArrayList<Car>(result); 
    } 
} 

Le modèle est de Play! cadre, de sorte que ces propriétés sont toutes publiques.

+1

Afficher votre code/mappage –

Répondre

2

Je doute la nécessité de CarProblem tout à fait, mais si vous allez garder cette carte, je crois que vous pourriez faire quelque chose comme ceci:

select c from CarProblem as cp join cp.car as c join cp.problem as p where p.id = :id 
+0

Merci, ça marche !!! BTW, La raison pour laquelle je garde une entité CarProblem est qu'il y a d'autres propriétés ici. – smallufo

+0

ouais, j'ai vu le "... autres propriétés" et je suppose que votre cartographie est votre affaire, alors je l'ai laissé seul ... la plupart du temps :) – digitaljoel

0

Si tout est déjà mis en correspondance correctement:

from Car c join c.problems p where p.id = :id

+0

Désolé, j'ai oublié de mentionner que Car n'est pas directement lié au problème. Car a beaucoup de CarProblems. Problème a beaucoup de problèmes de voiture. – smallufo

+1

Pouvez-vous s'il vous plaît fournir votre cartographie? Vous avez deux relations un-à-plusieurs? – serg

+0

Merci, j'ai ajouté mon code dans ma question. Il est utilisé dans Play! cadre. Je veux utiliser une ligne de HQL dans Problem.findCars() ... – smallufo