2013-09-06 2 views
1

У меня есть 3 таблицы с именем School, SchoolType и Country. Вы можете видеть отношения между School и SchoolType. Я хочу запросить;Запрос на спящий режим для нескольких таблиц

Выберите страны, которые имеют одинаковый идентификатор со школьными типами, в которых есть хотя бы одна школа под названием «blabla».

Мой класс школы;

@JoinColumn(name = "school_type_ref", referencedColumnName = "school") 
@ManyToOne(cascade = CascadeType.ALL, optional = false, fetch = FetchType.EAGER) 
private SchoolType schooltype; 

My SchoolType Class;

@LazyCollection(LazyCollectionOption.FALSE) 
@OneToMany(cascade = CascadeType.ALL, mappedBy = "schooltype") 
private List<School> schoolList; 

private String id; 

Мой класс Страна;

private String id; 
+0

Вы хотите критерии запроса для: SELECT * FROM стран WHERE ID IN (SELECT school_type_ref из школ, где имя = 'BlaBla')? Связана ли страна с SchoolType? – paulek

+0

@paulek Я думаю, что это правильная версия: SELECT * FROM countries WHERE id IN (select type.id from SchoolType type join School scl on type.school = scl.schooltype и scl.name = 'blabla') – hellzone

ответ

1

Проверьте это:

CriteriaBuilder cb = entityManager.getCriteriaBuilder(); 
CriteriaQuery<Country> c = cb.createQuery(Country.class); 
Root<Country> countries = c.from(Country.class); 

Subquery<Integer> sq = c.subquery(Integer.class); 
Root<SchoolType> schoolTypes = sq.from(SchoolType.class); 

sq.select(schoolTypes.<Integer>get("id")).where(
    cb.equal(schoolTypes.get("schoolList").get("name"), "blabla")); 

c.select(countries).where(cb.in(countries.<Integer>get("id")).value(sq)); 

TypedQuery<Country> q = entityManager.createQuery(c); 
List<Country> result = q.getResultList(); 

Кроме того, вместо schoolTypes.<Integer>get("id") вы можете попробовать использовать schoolTypes.get(SchoolType_.id), но он никогда не работает для меня.

Мой ответ на основе JPA 2.0, Criteria API, Subqueries, In Expressions

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