JPQL Left join с фильтрацией по коллекции "один ко многим"

У меня есть две сущности, пользователь и действие в отношении «один ко многим», где у пользователя много действий. Моя цель - получить всех пользователей с подмножеством действий на основе условия. например, я хотел бы получить всех пользователей и связанные с ними действия, которые находятся в состоянии ожидания. возможно, что у пользователя нет незавершенных действий. в этом случае вы хотите, чтобы пользователь не работал.

как я могу написать для этого JPQL.

заранее спасибо за вашу помощь


person Ruper    schedule 20.03.2015    source источник
comment
Хорошо, разобраться в том, что вы пробовали до сих пор?   -  person Sarz    schedule 20.03.2015
comment
** выберите u из пользователя u left join u.activity a, где a.state = 'Pending' **. но это не работает так, как я хотел   -  person Ruper    schedule 20.03.2015
comment
Пожалуйста, обновите свой вопрос, добавив некоторую информацию из базы данных.   -  person Sarz    schedule 20.03.2015


Ответы (2)


вы можете сделать эту ассоциацию набора, как в своей сущности:

//bi-directional many-to-one association to Activities
    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="Activity_Id")
    private Activity Activity;

    public Activity getActivity(){
        this.Activity
    }

В то время как когда ваши запросы:

List<User> toReturn= new ArrayList<>();
    Query query = em.createQuery("select u from User u ");
    List<User> list = query.getResultList();
    for(User u : list){
        if(u.getActivity().getStatus().equal("PENDING")){
            toReturn.add(u);
            //Some of your business Logic
        }
        //Some of your business Logic
    }

Надежда помогла!

person Sarz    schedule 20.03.2015

В JPA 2.1 был представлен JOIN ON, но я не уверен, что его можно комбинировать с FETCH. В основном я рекомендую попробовать следующий запрос:

SELECT u from User u LEFT JOIN FETCH u.activity a ON a.state = 'Pending'

Если у вас нет JPA 2.1 или если вышеуказанное решение не работает, вам придется взять пользователей и загрузить их действия впоследствии (в одном запросе) или загрузить пользователей со всеми их действиями и отфильтровать их, как писал Сарц. в его / ее ответе.

person Andrei I    schedule 20.03.2015