Hibernate HQL m: n проблема присоединения - PullRequest
0 голосов
/ 21 апреля 2010

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

У меня есть два объекта «многие ко многим» с таблицей отношений:

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

У одной машины может быть много проблем,

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

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

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

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

- обновлено:

Извините, не забудьте упомянуть:

Автомобиль имеет много 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);
  }
}

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

Ответы [ 2 ]

2 голосов
/ 21 апреля 2010

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

select c from CarProblem as cp join cp.car as c join cp.problem as p where p.id = :id
0 голосов
/ 21 апреля 2010

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

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

...