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
保留一个宠物集合。