![](/img/trans.png)
[英]JPA Specification join on fetch is not working (Hibernate, Spring Data JPA)
[英]Jpa + Hibernate join fetch returning inconsistent data
我們正在通過JPA + Hibernate 4執行一個查詢,該查詢返回一些不一致的數據。
我們有一個“父”表:
PARENT
id *
req_num
active
creation_date
和一個“孩子”表:
CHILD
id *
type
name
email
一個父級可能有多個子級,並且使用另一個表將其映射到數據庫中:
PARENT_CHILDS
parent_id (FK to PARENT)
child_id (FK to CHILD)
child_order
在Java中,我們的Parent類具有@OneToMany注釋列表,名為childs。 兩者都用@Entity注釋。 我們使用org.hibernate.cfg.ImprovedNamingStrategy作為我們的命名策略。
我們正在執行的查詢是:
select parent from Parent parent join fetch parent.childs child where child.type IN ('01', '02') and child.email = 'mail@mail.com' and parent.active = 1 and parent.reqNum != 'testReqNum'
這將轉換為下一個簡單的SQL查詢(我們正在使用show_sql = true屬性看到此查詢):
select parent0_.id as id2_, parent0_.active as active2_, parent0_.creation_date as creation2_
from parent parent0_
inner join parent_childs childs1_ on parent0_.id=childs1_.Application_id
inner join child child2_ on childs1_.child_id=child2_.id
where (child2_.type in (? , ?)) and child2_.email=? and parent0_.active=? and parent0_.req_num<>?
我們的父表只有2個滿足條件“ parent0_.active =?和parent0_.req_num <>?”的父表。 他們每個人都有兩個孩子。 並且他們的孩子中只有一個滿足條件“((?,?)中的child2_.type)和child2_.email =?”。
因此,當我們直接對Oracle數據庫執行SQL查詢時,它僅返回2行(兩個父級,每個父級只有一個孩子)。
但是,在Java中,我們正在恢復一些奇怪的結果,如果我們使用“內部聯接”,“聯接”或“聯接獲取”,結果會有所不同。 例如,我們收到三個父母的清單。 一個帶着一個孩子,另一個帶着另一個不滿足郵件條件的孩子,最后一個帶着兩個孩子。
我們想知道為什么我們會遇到這種現象,更重要的是,我們如何解決呢?
謝謝。 親切的問候。
正如我在評論中提到的,實現您的解決方案不需要多對多的關系。 此外,您的鏈接表不是正確的鏈接表,因為它具有自己的ID,因此必須將其視為另一個實體。
如果您無法更改數據庫架構,則可以通過以下方式實現實體之間的關系:
OneToMany
的關系, Parent
對ParentChild
ParentChild
到Child
的OneToOne
關系
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.