2017-03-02 70 views
1

假設有兩個實體 - 業主Hibernate HQL「加入的路徑!」 @ManyToOne關係

@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!

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 

注意,有業主在沒有@OneToManyCollection<Pet> pets。我想在寵物方面只有@ManyToOne

我錯過了什麼提示?

+0

「預期路徑」意味着「所有者」無法訪問寵物,除非它將它們存儲在集合中。我相信你必須讓'所有者'保持寵物的集合。 –

回答

1

試試這個

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

它的工作原理!太感謝了。 –

1

當HQL工作,你必須使用不只是實體

所以INNER JOINLEFT JOIN,例如,你應該使用的關係實體之間的關係直接

例如下一個有效查詢

選擇o由PET p內加入p.ownerö WHERE p.petId =:petId (同@rathna接受的答案)

選擇中的P由PET p WHERE p .owner.ownerId =:OWNERID

1

爲了完整起見,如果你需要LEFT JOIN但有@ManyToOne屬性在右側,因此不能指定路徑,您可以使用變換將查詢變爲RIGHT JOIN具有相同的效果。不會丟失其他表沒有匹配行並且在不丟失空行的情況下過濾另一個表的行)。

假設你想獲得不養寵物忽略名爲查理寵物所有業主:

不能指定

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