Использование SetJoin в JPA2 - PullRequest
0 голосов
/ 30 марта 2012

Как я могу код SQL ниже с использованием JPA2 CriteriaBuilder?

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

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

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

Ответы [ 2 ]

0 голосов
/ 02 апреля 2012

Спасибо @Magnus за подробную информацию, я решил мою проблему, как показано ниже:

predicate = criteriaBuilder.and(predicate, criteriaBuilder.equal(root.join("children", JoinType.INNER).get("code"), location.getCode()));
0 голосов
/ 02 апреля 2012

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...