Запрос на соединение с таблицей JPQL

Как заставить JPA и JPQL передавать полный запрос на соединение в СУБД? Например,

SELECT e
FROM Employee e
WHERE a.runkey = e.runkey
  AND e.middle = 'M'
  AND a.state = 'MA'

Со следующим классом сотрудников

@Entity
public class Employee implements Serializable {

  blah ... blah

  @OneToOne
  @JoinColumn(
    name = "runkey",
    referencedColumnName = "runkey",
    insertable=false, updatable=false)
  private Address address;
}

и JPQL,

SELECT e
FROM Employee e
INNER JOIN FETCH e.address AS a
WHERE a.state = :state
 AND e.middle = :middle

Я могу заставить Hibernate JPA извлекать данные, как и ожидалось.

Однако eclipselink хрипит, что не может пройти по связанному полю «адрес».

Если да, то как мне спроектировать сущность Employee и как мне сформулировать JPQL, чтобы заставить eclipselink выполнять объединение таблиц с фильтрами WHERE для обеих таблиц?

(Рэнт: В остальном Eclipselink JPA ничем не лучше JDO!!!)

~

Дополнительное редактирование: имеет ли это сообщение какое-либо отношение к моему делу....
https://forums.oracle.com/forums/thread.jspa?threadID=1568659


person Blessed Geek    schedule 24.07.2012    source источник
comment
Что такое n? Что является исключением (скопируйте трассировку стека)? JOIN FETCH должен работать.   -  person Anthony Accioly    schedule 25.07.2012
comment
Не н а е - поправил.   -  person Blessed Geek    schedule 25.07.2012
comment
JOIN FETCH должен работать — верно только для Hibernate JPA или нефильтрованного eclipselink. Когда я сменил провайдера на eclipselink, это не удалось, потому что eclipselink не позволяет мне фильтровать связанное поле.   -  person Blessed Geek    schedule 25.07.2012
comment
Вы дважды проверяли, что ваш импорт является JPA? например, убедитесь, что вы импортировали javax.persistence.OneToOne, а не org.hibernate.mapping.OneToOne?   -  person Affe    schedule 25.07.2012
comment
Да, только javax.persistence в объекте - потому что объект dto используется совместно GWT/RestyGWT и JPA (и JAXB и JAX-RS), а GWT не позволяет мне импортировать спящий режим в dto. К вашему сведению, GWT требует, чтобы цепочка наследования всех классов имела источник Java, и я не могу предоставить это для Hibernate. Поэтому определенно нет импорта гибернации в сущности dto.   -  person Blessed Geek    schedule 25.07.2012


Ответы (1)


Проблема в том, что вы пытаетесь использовать псевдоним для выборки соединения, что не разрешено спецификациями JPQL. Спящий режим в любом случае позволяет это. Вы по-прежнему можете получить желаемое поведение с EclipseLink, используя подсказки запроса .

Взгляните на следующие сообщения:

Также может быть полезна следующая ссылка:

http://wiki.eclipse.org/EclipseLink/Examples/JPA/QueryOptimization

person Anthony Accioly    schedule 24.07.2012
comment
Эта статья также является действительно хорошим источником о соединениях и пакетных подсказках. - person Anthony Accioly; 25.07.2012
comment
Я не понимаю, как работает подсказка. Разве подсказка не должна говорить e.middle = 'M', а не просто e.middle. В противном случае, как мне намекнуть eclipselink на фильтрацию только по middle='M'? - person Blessed Geek; 25.07.2012
comment
Вы по-прежнему будете использовать свои фильтры в запросе: e.middle = :middle и e.address.state = :state. Воспользуйтесь подсказкой, чтобы присоединиться к выборке e.address. Эта статья также совет обходить кеш. - person Anthony Accioly; 25.07.2012
comment
Спасибо за спасение моей жизни/проекта - низкий поклон, низкий поклон. - person Blessed Geek; 25.07.2012