2012-03-30 2 views
0

Как я могу скомпилировать sql ниже с помощью JPA2 CriteriaBuilder?Использование SetJoin в JPA2

select p from parent p, child c where c.parent_id=p.id and c.code='222' and c.type='SD'; 

Я попытался использовать SetJoin, но не мог понять, как использовать.

заранее спасибо

ответ

0

Один из альтернативных вариантов, соответствующих вашему запросу:

public void foo() { 
    // select p from parent p, child c where c.parent_id=p.id and c.code='222' and c.type='SD'; 
    CriteriaBuilder cb = entityManager.getCriteriaBuilder(); 
    CriteriaQuery <Parent> query = cb.createQuery(Parent.class); 

    Root <Parent> r1 = query.from(Parent.class); 
    Root <Child> r2 = query.from(Child.class); 

    Predicate[] predicates = new Predicate[] { 
     cb.equal(r1.get(Parent_.id), r2.get(Child_.parentId)), 
     cb.equal(r2.get(Child_.code), "222"), 
     cb.equal(r2.get(Child_.type, "SD")) 
    }; 

    query.select(r1); 
    query.where(predicates); 

    List <Parent> result = entityManager.createQuery(query).getResultList(); 
} 

Есть множество способов, чтобы сделать то, что вы хотите, но я ничего о вашей модели не знаю, что это трудно дать правильный пример, отличный от приведенного выше.

При условии, что родитель и ребенок связаны вы также можете сделать что-то вроде:

public void foo() { 
    CriteriaBuilder cb = entityManager.getCriteriaBuilder(); 
    CriteriaQuery <Parent> query = cb.createQuery(Parent.class); 

    Root <Child> child = query.from(Child.class); 
    Join <Child, Parent> parent = child.join(Child_.parent); 

    Predicate[] predicates = new Predicate[] { 
     cb.equal(child.get(Child_.code), "222"), 
     cb.equal(child.get(Child_.type, "SD")) 
    }; 

    query.select(parent); 
    query.where(predicates); 

    List <Parent> result = entityManager.createQuery(query).getResultList(); 
} 

Но это основано на множестве предположений.

+0

примеры предполагает, что вы используете мета-классы. –

0

Благодаря @Magnus для получения подробной информации, я ве решить мою проблему, как показано ниже:

predicate = criteriaBuilder.and(predicate, criteriaBuilder.equal(root.join("children", JoinType.INNER).get("code"), location.getCode())); 
Смежные вопросы