Java Hibernate HQL“;预期加入的路径&引用@多通关系

Java Hibernate HQL“;预期加入的路径&引用@多通关系,java,sql,hibernate,jpa,hql,Java,Sql,Hibernate,Jpa,Hql,假设有两个实体-所有者 @Entity @NamedQueries({ @NamedQuery(name = "Owner.findOwnerForPetId", query = "select o from Owner o inner join Pet p on o.ownerId=p.owner.ownerId where p.petId= :petId") }) public class Owner { @Id @Column(name = "ownerId") pri

假设有两个实体-所有者

@Entity
@NamedQueries({
   @NamedQuery(name = "Owner.findOwnerForPetId", query = "select o from Owner o inner join Pet p on o.ownerId=p.owner.ownerId where p.petId= :petId")
})
public class Owner {

  @Id
  @Column(name = "ownerId")
  private Long ownerId;

  @Column
  private String name;

  // scaffolding code...
}
和宠物

@Entity
public class Pet {

  @Id
  @Column(name = "petId")
  private Long petId;

  @ManyToOne(fetch = FetchType.LAZY)
  @JoinColumn(name = "ownerId")
  private Owner owner;

  @Column
  private String name;

  // scaffolding code...
}
一个主人可以有多个宠物(原来的类别被重命名),但一个宠物只能属于一个主人。我想做的是找到拥有宠物的主人,它有一些id,比如:

select Owner.ownerId, Owner.name from Owner inner join Pet on Owner.ownerId=Pet.ownerId where Pet.petId=3;
当在纯SQL中执行时,这可以很好地工作。但是,我在HQL中尝试了这两个查询,它们都给出了join所需的错误
路径

select o from Owner o inner join Pet p on o.ownerId=p.owner.ownerId where p.petId= :petId

请注意,Owner中没有
@OneToMany
收集宠物。我只想在宠物侧使用一个
@ManyToOne

关于我错过的东西有什么提示吗?

试试这个

  select o from Pet p inner join p.owner o where p.petId= :petId
试试这个

  select o from Pet p inner join p.owner o where p.petId= :petId

使用HQL时,必须使用实体之间的关系,而不仅仅是实体之间的关系

因此,对于内部联接左联接来说,您应该直接使用关系

例如,下面是有效的查询

从Petp内部连接p.o中选择o,其中p.petId=:petId(与@rathna接受答案相同)

从宠物p中选择p,其中p.owner.ownerId=:ownerId


使用HQL时,必须使用实体之间的关系,而不仅仅是实体之间的关系

因此,对于内部联接左联接来说,您应该直接使用关系

例如,下面是有效的查询

从Petp内部连接p.o中选择o,其中p.petId=:petId(与@rathna接受答案相同)

从宠物p中选择p,其中p.owner.ownerId=:ownerId


为完整起见,如果需要左连接,但右侧有@ManyToOne属性,因此无法指定路径,则可以将查询转换为右连接,效果相同(即,在另一个表没有匹配行的情况下不丢失行,并在不丢失空行的情况下过滤另一个表)

假设您想让所有没有宠物的主人忽略名为Charly的宠物:

你不能指定

SELECT o
FROM Owner o
LEFT JOIN o.pet p (<-------- ERROR) WITH p.name != 'Charly'
GROUP BY o.ownerId
HAVING count(p.petId) = 0

为完整起见,如果需要左连接,但右侧有@ManyToOne属性,因此无法指定路径,则可以将查询转换为右连接,效果相同(即,在另一个表没有匹配行的情况下不丢失行,并在不丢失空行的情况下过滤另一个表)

假设您想让所有没有宠物的主人忽略名为Charly的宠物:

你不能指定

SELECT o
FROM Owner o
LEFT JOIN o.pet p (<-------- ERROR) WITH p.name != 'Charly'
GROUP BY o.ownerId
HAVING count(p.petId) = 0
“预期路径”意味着
Owner
无法访问宠物,除非它将它们存储在一个集合中。我相信您必须让
Owner
保留一个宠物集合。“预期路径”这意味着,
Owner
无法访问宠物,除非它将它们存储在一个集合中。我相信你必须让
Owner
保留一个宠物集合。