HQL: получить только несколько полей от объекта по запросу, включая JOIN - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть следующие таблицы гибернации:

public class Customer {
    //some fields... include customerId field
    public Person person;
    @OneToOne(cascade = { CascadeType.ALL },  fetch = FetchType.LAZY)
    @JoinColumn(name = "person_id", unique = false, nullable = true, insertable = true, updatable = true)
    public Person getPerson e () {
        return person;
    }

}

 public class Person {
    //some fields...

    private Set<History> histories;

    @ManyToMany(fetch=FetchType.LAZY, targetEntity=History.class,cascade={CascadeType.PERSIST,CascadeType.MERGE})
    @JoinTable(name="person_m2m_history",joinColumns={@JoinColumn(name="person_id")},
            inverseJoinColumns={@JoinColumn(name="persone_history_id")})
    public Set<History> getHistories() {
        return this.histories;
    }       
}

А также таблица истории, дизайн которой не актуален.Отношение Клиента к таблице истории является персоной лица.Я хочу получить с помощью HQL (а не нативного) несколько полей клиента, основываясь на его истории, но получил ошибку.Что я сделал неправильно?

Вот мой запрос:

entityManager.createQuery("select c.customerId, ph.changedOn,
    ph.changedField, from Customer c 
    left join fetch c.person p 
    left join fetch p.histories ph 
    where ph.changedField = 'name'")

Это ошибка, вызванная CreateQuery:

'org.hibernate.QueryException:запросил указанную выборку соединения, но владелец извлеченной ассоциации не присутствовал в списке выбора [FromElement {явный, не объединение коллекции, извлечение соединения, извлечение не ленивых свойств, classAlias ​​= e, role = myProject.Customer.person,tableName = Person, tableAlias ​​= person1_, origin = customer customer0_, columns = {customer0_.person_id, className = myProejct.Person}}] [select c.customerId, ph.changedOn, ph.changedField, из клиентского c, оставившего выборку присоединения c.человек p оставленный присоединиться к выборке p.histories ph где ph.changedField = 'name'] '

1 Ответ

0 голосов
/ 13 февраля 2019

Проверьте ваш запрос, у него есть лишняя запятая рядом с из , from

entityManager.createQuery("select c.customerId, ph.changedOn,
    ph.changedField from Customer c 
    left join fetch c.person p 
    left join fetch p.histories ph 
    where ph.changedField = 'name'")

, это может работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...