2011-08-23 74 views
2

我是Play和Hibernate的新手,正在開發一個項目。我喜歡它迄今!如何使用Play,MySQL和Hibernate自定義查詢ManyToMany表?

我遇到了一個新的問題最近。我有一張桌子。然後,我在該類中引用了一個ManyToMany關係。所以Hibernate創建這個表格就好了,我有peopleid1和peopleid2,人們可以和其他各種人建立關係,反之亦然。

我現在需要在該表上運行一些複雜的查詢,並且遇到了一些麻煩,因爲我想將它放到它自己的類中,但不確定這是最好的方法還是使用hibernate。 JPQL是答案嗎?任何幫助或想法表示讚賞!

讓我們使用堂兄弟作爲一個例子。我有一個班級/模型人,這些人有堂兄弟,可以是堂兄弟。現在我在我的代碼中有這個:

@ManyToMany(cascade=CascadeType.ALL) 
@JoinTable(name = "Cousins", 
    joinColumns = { @JoinColumn(name = "personid") }, 
    inverseJoinColumns = { @JoinColumn(name = "cousinid") }) 
public Set<User> cousins; 

這很好,並創建完美的連接表,我可以輸入數據和正如預期的那樣。但是,我試圖寫一個函數卡住了。我可以找到所有登錄人員都有堂兄弟的人,但無法找到登錄的用戶是堂兄弟的所有人。我認爲這是做到這一點的正確方法,但我非常傾向於讓Cousins成爲自己的類/模型,當我這樣做的時候工作正常,但我不確定Hibernate如何管理關係。

+0

什麼問題?如果您問的是JPQL是使用Hibernate執行請求的方式,則答案爲是。如果你問連接表是否必須映射爲實體,答案是否定的。閱讀hibernate參考文檔:解釋它。 http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#collections-bidirectional –

回答

1

表姐的關係是有點奇怪becaue這純粹是對稱的:如果A是B的表弟,那麼B也爲A.

的表弟這是一個經典的學生,課程的關係,其中每個不同關係方有不同的作用。

必須,但是,覺得作爲一個roleA-roleB關係表哥關係。你可以將它定義爲person-cousin personId指向該人,並且cousinId指向堂兄。所以,如果你想說人A有表兄B,你必須在聯接表中有一個元組aId-bId。如果你還想說人B有堂兄A,你必須在連接表中有一個元組bId-aId。

的HQL找到一個人的所有表兄弟因此以下內容:

select cousin from People person inner join person.cousins cousin where person.id = :personId 

的HQL找到表妹的所有的人是這個:

select person from People person inner join person.cousins cousin where cousin.id = :cousinId 

想想而言角色而不是表格,它會變得更容易。考慮表妹是一個孩子,還是一個人作爲父母,這可能是一個好主意,因爲它使得這個關聯不對稱並且使得這個角色更加明顯。

+0

謝謝你的解釋。 – user908360