[英]Hibernate HQL “Path expected for join!” @ManyToOne relationship
假设有两个实体-所有者
@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中尝试了这两个查询,并且它们都给出了Path expected for join!
的错误Path expected for join!
select o from Owner o inner join Pet p on o.ownerId=p.owner.ownerId where p.petId= :petId
和
from Owner o join Pet p where p.petId= :petId
请注意,所有者中没有@OneToMany
或Collection<Pet> pets
。 我@ManyToOne
在Pet一侧使用@ManyToOne
来完成此操作。
关于我错过了什么的任何提示?
试试这个
select o from Pet p inner join p.owner o where p.petId= :petId
使用HQL时,您必须使用实体之间的关系,而不仅仅是实体
因此,例如对于INNER JOIN和LEFT JOIN ,您应使用直接关系
例如接下来是有效的查询
从Pet中选择o内部联接p。 所有者o WHERE p.petId =:petId (与@rathna接受的答案相同)
从宠物p 那里选择p p.owner.ownerId =:ownerId
为了完整起见,如果您需要LEFT JOIN但在右侧具有@ManyToOne属性,因此无法指定路径,则可以将查询转换为具有相同效果的RIGHT JOIN (即,不丢失行,另一个表没有匹配的行,并且在不丢失空行的情况下过滤了另一个表)。
假设您想让所有没有宠物的主人都忽略名为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
但是您可以将其转换为:
SELECT o
FROM Pet p
RIGHT JOIN p.owner o WITH p.name != 'Charly'
GROUP BY o.ownerId
HAVING count(p.petId) = 0
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.