与相关实体的子查询的HQL错误

时间:2011-10-28 22:09:28

标签: hibernate hql

我一直在尝试使用HQL子查询检索相关实体时遇到问题。我有三个实体:Customer实体,Account实体和我称为Relation的其他实体。最初我在CustomerAccount之间存在多对多关系,但后来我不得不添加这个名为Relation的新实体,因为我需要在{{1}之间的关系中添加其他信息}和Customer。由于Account不再映射到问题中的任何其他类,我将把它遗漏掉。

  • 地址(仅限有趣的部分)
  

@Entity(name =“Address”)
  @Table(name =“Address”)
  公共类地址延伸{
  .....
  @OneToMany(fetch = FetchType.LAZY,mappedBy =“address”,
  orphanRemoval = true)
  private Set relations = new HashSet();
  @柱()   private String number = null;
  .....
  }

  • 关系(只有有趣的部分)
  

@Entity(name =“Relation”)
  @Table(name =“CustomerAccount”)
  @IdClass(Relation.RelationId.class)
  公共阶层关系{
  ....
  @Id
  @ManyToOne(fetch = FetchType.LAZY)
  私人帐户帐户= null;
  @Id
  @ManyToOne(fetch = FetchType.LAZY)
  private Customer customer = null;   ....
  }

我想要获得的是以下内容:

  • 根据具体的Customer(使用其ID)和特定的Customer号码,获取指定客户的Account及其Account(如果有)

这是我试图执行的hql查询来完成此任务:

  

从帐户中选择帐户,(从account.relations内部联接关系中选择关系。客户,客户ID =:id),其中account.number =:number

生成的sql如下:

  

选择account0_.Id为col_0_0_,
  (选择
  (relations1_.AccountId,
  relations1_.CustomerId)
  从
  CustomerAccount relations1_
  内连接   客户customer2_
  on relations1_.CustomerId = customer2_.UserId
  内连接   OlsUser customer2_1_
  在customer2_.UserId = customer2_1_.Id
  其中
  account0_.Id = relations1_.AccountId
  和customer2_.UserId =?)为col_1_0_,
  account0_.Id为Id0_,
  account0_.number为AccountN2_0 _,
  account0_.Active as Active0_,
  account0_.Application as Applicat4_0_,
  account0_.Description as Descript8_0_,
  account0_.LastUpdated为LastUpda9_0_,
  从
  帐户account__
  其中
  account0_.number =?

我认为hql中的子查询有问题,最后是异常

Relation

我与子查询的特定部分有关但不确定它在下面发生了什么。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

首先。地址实际上是帐户,对吧?

回答您的问题:您的查询比需要的要复杂得多。你所需要的只是

select account, relation from Relation relation
inner join relation.account account
where account.number = :number
and relation.customer.id = :customerId

答案 1 :(得分:0)

最后..如前所述,我让它复杂化了。查询比

更简单

select account, relation from Account account left join account.relations relation with relation.customer.id = :id where account.number = :number