Псевдоним таблицы критериев Jpa

Привет, я изо всех сил пытаюсь написать следующий запрос с критериями API: «ВЫБЕРИТЕ c.id, curr.name FROM Cargo c, Currency curr»

Проблема в том, что и Cargo, и Currency имеют псевдоним c по критериям, поэтому результирующий jpql становится «SELECT c.id,c.name FROM Cargo c, Currency c».

Я не знаю, потому что обе сущности начинаются с C. Есть ли способ изменить псевдоним таблицы?

CriteriaBuilder criteriaBuilder = getEntityManager().getCriteriaBuilder();
CriteriaQuery<Tuple> query= criteriaBuilder.createTupleQuery();

Root<Cargo> cargo= query.from(Cargo.class);
Root<Currency> currency= query.from(Currency.class);

Любая помощь очень ценится.


person ben boahen    schedule 13.09.2013    source источник
comment
И SELECT c.id, curr.name FROM Cargo c JOIN Currency curr?   -  person Joop Eggen    schedule 13.09.2013
comment
Проверьте свои спецификации сопоставления для обеих сущностей и убедитесь, что они не сопоставлены с одной и той же таблицей.   -  person ben75    schedule 13.09.2013
comment
Они сопоставляются с разными таблицами. Имена таблиц различаются для обоих объектов.   -  person ben boahen    schedule 13.09.2013
comment
Имена сущностей не должны влиять на критерии api, так как они в любом случае обычно не переводятся в JPQL (хотя вы не упомянули провайдера). Какой SQL вы получаете и какие результаты вы пытаетесь получить? SELECT c.id,curr.name FROM Cargo c, Currency curr возвращает декартово произведение двух таблиц и не кажется таким уж полезным, действительно ли это то, что нужно вашему приложению?   -  person Chris    schedule 13.09.2013
comment
Я использую openjpa 2.2.2. Это SQL, который я получаю, как указано в моем исходном сообщении: SELECT c.id,c.name FROM Cargo c, Currency c. Дело в том, что ДВА объекта имеют псевдоним c.   -  person ben boahen    schedule 13.09.2013
comment
Когда я использую одну сущность, проблем нет. Две или более сущности, которые начинаются с разных букв, не проблема. Но когда они начинаются с той же буквы, что и в моем посте, тогда упс!. Возможно, псевдоним выбирается из первых букв сущностей. имена.   -  person ben boahen    schedule 13.09.2013


Ответы (2)


В вашем коде отсутствует часть, где вы указываете, что хотите выбрать. «ВЫБРАТЬ c.id,curr.name FROM Cargo c, Currency curr», скорее всего, переводится примерно так:

CriteriaBuilder criteriaBuilder = getEntityManager().getCriteriaBuilder();
CriteriaQuery<Tuple> query= criteriaBuilder.createTupleQuery();

Root<Cargo> cargo= query.from(Cargo.class);
Root<Currency> currency= query.from(Currency.class);

query.multiselect(cargo.get("id"), currency.get("name"));
Query query = em.createQuery(cq);
List<Tuple> results = query.getResultList();

Здесь приведен пример использования только одной таблицы: http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Querying/Criteria#Tuple_Queries

person Chris    schedule 13.09.2013
comment
Когда я использую одну сущность, проблем нет. Две или более сущности, которые начинаются с разных букв, не проблема. Но когда они начинаются с той же буквы, что и в моем посте, тогда упс!. Возможно, псевдоним выбирается из первых букв сущностей. имена. - person ben boahen; 13.09.2013
comment
Может быть. Вы пытались исправить запрос, как было предложено, и получили ли вы тот же результат? Что происходит с запросом JPQL? - person Chris; 16.09.2013
comment
Да, я сделал. Получил тот же результат. Я могу подтвердить, что псевдоним таблицы выбран из первой буквы имени объекта. - person ben boahen; 19.09.2013

После долгих отладок я обнаружил, что фактический исполняемый jpql отличается от того, который отображается в моем ide (eclipse). Псевдонимы были в порядке. Я думаю, что я был немного обманут ide. Всем спасибо за внимание.

person ben boahen    schedule 24.09.2013