JPQL: проблема со следующим предложением WHERE, использующим наследование - PullRequest
2 голосов
/ 27 апреля 2011

Я использую следующий запрос для получения всех фруктов, связанных с пользователем.

return (List<Fruit>) getEm()
            .createQuery(
                    "SELECT DISTINCT f FROM Fruit f, User u WHERE (f = u.apples OR f = u.oranges OR f = u.mangos) AND u.id = :id")
            .setParameter("id", id).getResultList();

Соответствующие сущности следующие:

public class Fruit{

private int id;

}

public class User{

private int id;
private Collection<Apple> apples;
private Collection<Orange> oranges;
private Collection<Mango> mangos;

}

public class Mango extends Fruit{

private int id;
...

}

public class Apple extends Fruit{

private int id;
...

}

public class Orange extends Fruit{

private int id;
...

}

Проблема в том, что вышеупомянутый запрос не дает мне результата, если для пользователя не существует какой-либо из коллекций. Так что, если у пользователя нет яблок, я не получаю 0 в результате. Я уже пытался отлавливать ошибки с помощью таких утверждений, как u.apples НЕ ПУСТО и т. Д., Но это тоже работает.

Так, не могли бы вы дать мне подсказку по этому делу? Все было бы проще, если Fruit будет иметь отношение один-ко-многим к пользователю, но, к сожалению, я не могу позволить себе это для программы ...

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 27 апреля 2011

Ваш JPQL недействителен, поэтому я не совсем уверен, как он работает.

Вы можете использовать только "." нотация для ToOne, а не ToMany, для ToMany вам нужно использовать объединение. Для объединения вы можете использовать внешнее соединение, чтобы не разрешать ни одного.

SELECT DISTINCT f FROM Fruit f, User u left join u.apples a ... WHERE f = a or ...
0 голосов
/ 27 апреля 2011

Подозреваю, что вы хотите IN, а не =, но фразы типа "не могу себе это позволить для программы" заставляют меня нервничать, что происходит много взломанных вещей.

...