HQL:通过查询仅从实体中检索几个字段,包括JOIN

时间:2019-02-13 09:45:41

标签: hibernate hql

我有以下休眠表:

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}}]] [选择c.customerId,ph.changedOn,   ph.changedField,从客户c左联接获取c.person p左联接   获取p.histories ph,其中ph.changedField ='name']'

1 个答案:

答案 0 :(得分:0)

检查您的查询,来自附近有一个逗号 , 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'")

可能有效。