Прежде всего, ваше отображение выглядит некорректно. У вас двунаправленная связь между Owner
и Vehicles
. Таким образом, только сторона @ManyToOne
должна быть аннотирована @JoinColumn
. Я буду использовать скорректированное отображение следующим образом:
@Entity
@Table
public class Owner
{
@Id
@Column(name = "own_id")
private Long id;
@OneToMany(mappedBy = "owner")
private Set<Vehicles> vehicles;
}
@Entity
@Table
public class Vehicles
{
@Id
@Column(name = "veh_id")
private Long id;
@Column(name = "veh_name")
private String name;
@ManyToOne
@JoinColumn(name = "veh_own_id")
private Owner owner;
}
Следующее, что я должен подчеркнуть, вы пытаетесь использовать устаревший Hibernate org.hibernate.Criteria
API . Я собираюсь привести пример для Criteria API . Таким образом, запрос будет иметь следующий вид:
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<Owner> criteria = builder.createQuery(Owner.class);
Root<Owner> root = criteria.from(Owner.class);
SetJoin<Owner, Vehicles> vehs = (SetJoin<Owner, Vehicles>) root.fetch(Owner_.vehicles);
criteria
.select(root)
.distinct(true)
.where(
vehs.get(Vehicles_.NAME).in(Arrays.asList("car", "jeep", "truck", "bike"))
);
List<Owner> deps = session.createQuery(criteria).getResultList();
Классы Owner_
и Vehicles_
относятся к так называемым JPA stati c метамодели . Почему приведение (SetJoin<Owner, Vehicles>) root.fetch(Owner_.vehicles)
необходимо, описано в этой статье (см. Определение раздела JOIN FETCH раздел).