我有以下休眠表:
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']'
答案 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'")
可能有效。