Java: оператор выбора JPQL - PullRequest
1 голос
/ 25 мая 2010

select x from X x where x.a.id = :a_id -> Всегда выбрано 0 объектов

Почему вышеприведенный оператор JPQL не работает, а приведенный ниже работает?

select a from A a where a.id = :a_id -> a_obj
select x from X x where x.a = :a_obj -> Всегда правильное количество выбранных объектов

Ни один запрос не генерирует исключение во время выполнения, но получается другое количество результатов.

Спасибо


Обновление

Я пробовал следующие запросы с помощью объединений:
select x from X x, x.a a where x.a.id = :a_id -> исключение TopLink для неожиданного токена

и это: select x from X x JOIN x.a a where a.id = :a_id -> Всегда правильное количество выбранных объектов

С помощью последнего запроса я решил начальную проблему под рукой. Однако теперь у меня есть два запроса, которые должны работать, но по какой-то причине не работают.

select x from X x where x.a.id = :a_id -> Всегда выбрано 0 объектов
select x from X x, x.a a where x.a.id = :a_id -> Исключение TopLink для неожиданного токена

Кто-нибудь еще сталкивался с подобным поведением?

Ответы [ 2 ]

1 голос
/ 25 мая 2010

Со следующей сущностью для X

@Entity
public class EntityX {

    @Id @GeneratedValue
    private Long id;

    @OneToOne
    private EntityA a;

    // ...
}

А этот для А:

@Entity
public class EntityA {
    @Id @GeneratedValue
    private Long id;

   //...
}

Следующий запрос JPQL:

from EntityX x where x.a.id = :id

Создает следующий SQL:

select
  entityx0_.id as id282_,
  entityx0_.a_id as a2_282_ 
 from
  EntityX entityx0_ 
 where
  entityx0_.a_id=?

Он просто работает и возвращает столько результатов, сколько ожидалось.

Протестировано с Hibernate (и EclipseLink). Если это не соответствует вашему делу, пожалуйста, добавьте больше деталей.

0 голосов
/ 25 мая 2010

Я думаю, что вы должны также ввести сущность a в первом примере, чтобы ее атрибуты были видны.

Что-то вроде

select x from X x join fetch x.a where x.a.id = :a_id

(я не использую JPA, я придерживаюсь HQL, так что это непроверенный, непроверенный и без гарантии возврата денег.)

...