[問題] 請問JPA如何做階層式查詢

看板java作者 (929rock化)時間11年前 (2014/07/17 02:16), 11年前編輯推噓5(5020)
留言25則, 8人參與, 最新討論串1/6 (看更多)
例如有某一張Table存放一家公司底下的處部等關係, Aa ┬ Ba ┬ Ca ┬ Da ├ Bb ├ Cb └ Db ┬ Ea ┬ Fa │ └ Cc └ Eb ├ Fb └ Bc ┬ Cd ┬ Dc └ Fc │ └ Dd ┬ Ec └ Ce ┬ De └ Ed ├ Df └ Dg 目前table已經做出階層式的關係, class MyEntity { @Id @... private Integer seq; @ManyToOne @JoinColumn(name="parent_seq") private MyEntity parent; @OneToMany @JoinTable( name="link" ,joinColumns = @JoinColumn( name = "parent_seq" ,referencedColumnName = "seq" ) ,inverseJoinColumns = @JoinColumn( name = "child_seq" ,referencedColumnName = "seq" ) ) private Set<MyEntity> children; ... } 現在寫入、跟一般查詢都很正常, 可以取到我要的資料,然後可以看到上下的關係 但如果處部有名字一樣的時候,我想查到某個支線下的處部關係,要怎麼做? 例如如下圖的 Ea 跟 Df 同時都叫"總務部"好了 Aa ┬ Ba ┬ Ca ┬ Da ├ Bb ├ Cb └ Db ┬ Ea ┬ Fa │ └ Cc └ Eb ├ Fb └ Bc ┬ Cd ┬ Dc └ Fc │ └ Dd ┬ Ec └ Ce ┬ De └ Ed ├ Df └ Dg 然後今天我想找Ea這個部,底下還有細分那些部, 但我所擁有的條件,就只有 Aa Ba Ca Db Ea 的名字, 要怎麼做才能找到我要 Ea ? 因為如果直接條件下"總務部",我會得到兩筆資料, 然後兩筆要往上查看是否為我要找的支線, 要不然就變成是全查出來,然後遞迴去找到我要的 Ea... 這兩個方法都滿笨的,而且要寫不少code... 小弟我這兩天想破頭了,也有想調整結構,或者多Table來處理, 但都一樣很麻煩,省不了工... 所以上來請教一下各版大有沒有其他比較方便方法能達到這個目的? 感恩<(_ _)> -- 為什麼不說話 為什麼打哈欠 今天的天氣這麼好 怎麼還愁眉苦著臉 讓我們喝咖啡 讓我們聽音樂 讓我們跨越了界線 讓我們自在的聊天 黃玠 讓我們每天心情都是星期天 生活一堆毛 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 123.194.158.25 ※ 文章網址: http://www.ptt.cc/bbs/java/M.1405534578.A.192.html ※ 編輯: NullLife (123.194.158.25), 07/17/2014 02:18:26

07/17 10:10, , 1F
同樣的問題 +1 其實這不只在java上會有這個問題.....
07/17 10:10, 1F

07/17 10:10, , 2F
只要是資料庫對上樹狀結構,應該都會有這個問題....
07/17 10:10, 2F
主是要想問JPA或者有沒有其他機制能做這件事情?

07/17 10:19, , 3F
把所有從root至leaf的路徑都變成一份record可以嗎?
07/17 10:19, 3F

07/17 10:20, , 4F
例如{Aa,Ba,Ca,Da,null,null}, {Aa,Ba,Ca,Db,Ea,Fa}, ...
07/17 10:20, 4F

07/17 10:21, , 5F
如果公司階層不常變,就開固定數目的欄位就好
07/17 10:21, 5F

07/17 10:22, , 6F
如果常變動,就只存在一個欄位中,然後用分隔符號分開
07/17 10:22, 6F

07/17 10:22, , 7F
例如"Aa|Ba|Ca|Da", "Aa|Ba|Ca|Db|Ea|Fa"這樣 用like搜尋
07/17 10:22, 7F

07/17 10:23, , 8F
不知道我有沒有誤解你的意思...
07/17 10:23, 8F
我舉的例子量很小,實際我的運用並不是處部,大致上會像是我們電腦資料夾的樣子, 而且可能會經常變更... 不過這也是一個方法,我考量一下系統狀況是否適合做這件事,謝謝。

07/17 12:01, , 9F
是討論SQL還是討論JAVA的爬資料結構阿
07/17 12:01, 9F
抱歉,可能沒說的很清楚, 我想不太算討論SQL耶,因為JPA都做掉大部分的事情了, 所以想請教有沒有其他方法來爬這種資料結構? ※ 編輯: NullLife (125.227.157.211), 07/17/2014 12:22:20

07/17 12:23, , 10F
其實每個用JPA久的都會遇到這個問題, JPA是個剛開始用
07/17 12:23, 10F

07/17 12:24, , 11F
很爽,系統大了就很難掌握的架構。
07/17 12:24, 11F

07/17 12:25, , 12F
比較像是邏輯問題
07/17 12:25, 12F

07/17 13:30, , 13F
要想的是~是哪裡的總務部~還是無差別的總務部
07/17 13:30, 13F

07/17 13:31, , 14F
照你的需求~應該是Ba下的總務部-Ea
07/17 13:31, 14F

07/17 13:31, , 15F
所以應該要先去找Ba~然後再去Ba的子階層去找到符合總務部
07/17 13:31, 15F

07/17 13:33, , 16F
最主要還是總務部的定義為何?因為有的時候就是要上爬
07/17 13:33, 16F

07/17 13:34, , 17F
但我習慣先去定義總務部的範圍大概有哪裡~在去決定實作
07/17 13:34, 17F

07/17 13:35, , 18F
這個跟爬HTML的DOM沒甚麼兩樣阿~
07/17 13:35, 18F

07/17 13:37, , 19F
不然你就在Entity裡面弄幾個索引阿~~這樣就不用爬拉
07/17 13:37, 19F

07/17 13:38, , 20F
在建立資料結構的時候~同時建立相對的索引
07/17 13:38, 20F

07/17 13:39, , 21F
缺點是初始的比較耗資源~優點就是查詢方便阿
07/17 13:39, 21F

07/17 13:39, , 22F
但是資料有很多嗎~不然幾百筆資料遞迴一下很快拉
07/17 13:39, 22F

07/17 15:03, , 23F
雖然與JPA無關http://ppt.cc/dRGB,不然就放入LDAP內
07/17 15:03, 23F

07/17 18:51, , 24F
感謝各位大大,已有方法解決,感恩<(_ _)>
07/17 18:51, 24F

07/18 08:49, , 25F
JPA在多個JVM上跑 不知道有沒有對db lock做處理的solution?
07/18 08:49, 25F
文章代碼(AID): #1Jni5o6I (java)
文章代碼(AID): #1Jni5o6I (java)