2010-04-20 2 views
0

Я очень знаком с SQL/HQL, и я в настоящее время застрял с этим «может быть» простой задачи:Hibernate HQL м: п присоединиться к проблеме

У меня есть два многие-ко-многим Сущности, с таблицей соотношения:

Автомобиль, проблема с автомобилем и проблема.

Один автомобиля может иметь много проблем,

Одна проблема может появиться во многих автомобилях,

CarProblem является таблицей ассоциации с другими свойствами.

Теперь я хочу найти Автомобиль (ы) с указанной проблемой, как написать такой HQL? Все идентификаторы длинного типа.

Я пробовал много присоединиться к/внутрипартийной присоединиться к комбинации, но все напрасно ..

- обновление:

К сожалению, забыл упомянуть:

Автомобиль имеет много CarProblem

Проблема имеет много CarProblem

автомобиля и проблемы не связаны непосредственно в Java Object.

- обновление, Java код ниже -

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

Модель от игры! рамки, поэтому эти свойства являются общедоступными.

+1

Показать ваш код/​​картирование –

ответ

2

Я бы вопрос о необходимости для CarProblem в целом, но если вы собираетесь держать это отображение Я считаю, что вы могли бы сделать что-то вроде этого:

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

Спасибо, это работает !!! BTW, причина, по которой я сохраняю объект CarProblem, здесь есть другие свойства. – smallufo

+0

Да, я видел «... другие свойства», и я считаю, что ваше сопоставление - это ваш бизнес, поэтому я оставил его в покое ... в основном :) – digitaljoel

0

Предполагая, что все уже отображается правильно:

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

+0

Извините, не забудьте упомянуть, что у автомобиля нет прямой ссылки на проблему. Автомобиль имеет много автомобилей. Проблема имеет много CarProblems. – smallufo

+1

Можете ли вы, пожалуйста, оформить картографию? У вас есть два отношения «один ко многим»? – serg

+0

Спасибо, я добавил свой код в свой вопрос. Он используется в Play! фреймворк . Я хочу использовать одну строку HQL в Problem.findCars() ... – smallufo

Смежные вопросы